java基础-JAVA IO

首先JAVA IO为什么不叫文件而叫IO? IO其实是对文件或者网路的抽象,抽象成“流”,“流”是一维的,并且是hi单向流动的:从文件中读数据是流、向文件中写数据也是流、从网络中读数据是流、向网络中写数据也是流等等。

按数据走向来分可以分为输入流,输出流

按处理的数据类型可以分为字符流和字节流

首先要区分JAVA IO针对的对象, 把自己比作一个程序,向程序写数据就是Input操作,从程序向外输出数据就是Output操作

JAVA IO大致分为字节流和字符流。字节流:数据时二进制,人不可读,有InputStream, OutputStream接口。 字符流:数据是基于字符的,认识可读的,有Reader,Writer接口。

各种流的继承关系:

反正我第一次看见的时候很头疼,这么多类压根分不清,弄不明白。但是常用的有FileReader, BufferedReader, FileWriter,FileInputStream, FileOutputStream。具体用的时候可以参考API文档

下面结合实际,写一下代码看看具体的接口是如何使用的

File f = new File("src/Java/io/ReadMySelf.java");
System.out.println(f.exists()); //判断当前文件是否存在
System.out.println(f.getAbsolutePath()); //得到当前文件的绝对路径 F:\JavaLearning\src\Java\io\ReadMySelf.java

诸如此类的操作还有f.canRead(), f.canWrite(), f.canExcute(),f.creatNewFile()会判断当前文件是否存在,若不存在会生成新的文件

File[] files = f.listFiles();  //对files进行遍历可以的到当前文件下的所有文件目录

接下来展示用字符流来读取文件:

public class ReadMySelf {
    public static void main(String[] args) throws Exception {
      File f = new File("src/Java/io/ReadMySelf.java");
      FileReader fr = null;
      try {
          fr = new FileReader(f);
          char[] buffer = new char[10];
          int length = -1;
          while((length = fr.read(buffer)) != -1) {  //每次读取10个字节
          if(length == 10) {
              System.out.print(buffer);
          }else {
              System.out.println(new String(buffer, 0, length));
          }
        }
      } catch(Exception e) {
          e.printStackTrace();
      } finally {
          if(fr != null) {
            fr.close();
          }
      }}

也可以使用BufferedReader逐行读取

public class ReadMySelf {
    public static void main(String[] args) throws Exception {
    File f = new File("src/Java/io/ReadMySelf.java");
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(f));
        String line = null;
        while((line = br.readLine()) != null) {
        System.out.println(line);
        }
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        if(br != null) {
        br.close();
        }
    }
}  

使用StringWriter/FileWriter写数据,这里采用StringWriter

public class ReadMySelf {
    public static void main(String[] args) throws Exception {
    File f = new File("src/Java/io/ReadMySelf.java");
    StringWriter sw = new StringWriter();
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(f));
        String line = null;
        while((line = br.readLine()) != null) {
        sw.write(line);
        sw.write("\n");
        }
        System.out.println(sw.toString());
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        if(br != null) {
        br.close();
        }
    }}

下面才采用字节流来读取一个图片,并写入本地程序文件夹下:

public class ReadMySelf {
    public static void main(String[] args) throws Exception {

    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
        byte[] buffer = new byte[1024];
        File f = new File("F:/JavaLearning/bd_logo.png");
        System.out.println(f.exists());
        bis = new BufferedInputStream(new FileInputStream("F:/JavaLearning/bd_logo.png"));
        bos = new BufferedOutputStream(new FileOutputStream("src/Java/io/a.png"));

        int length = -1;
        while((length = bis.read(buffer)) != -1) {
          bos.write(buffer, 0, length);
        }
        bos.flush();
    } catch(Exception e) {

    } finally {
        bis.close();
        bos.close();
    }
}

以上都是顺序读写文件,还可以使用RandomAccessFile随机读写文件,有两种模式“”rw“” “”r“”(只读)
RandomAccessFile raf=new RandomAccessFile (file,"rw")
内部包含一个文件指针,打开文件时指针在开头pointer=0;读写操作时指针会往后移动,使用seek(int index); 可以操作指针

public class ReadMySelf {
    public static void main(String[] args) throws Exception {

    RandomAccessFile file = new RandomAccessFile("src/Java/io/readme.txt", "rw");//若文件不存在会在本地创建
    file.writeInt(20);  //占4个字节
    file.writeDouble(3.1415926);    //占8个字节
    file.writeUTF("这是一个UTF字符串");     //这个长度写在当前文件指针的前两个字节出,可以用readShort()读取
    file.writeBoolean(true); //占1个字节
    file.writeShort(155); //占2个字节
    file.writeLong(1563231521); //占8个字节
    file.writeUTF("又是一个UTF字符串");
    file.writeFloat(35.12f);  //占4个字节
    file.writeChar(‘a‘); //占2个字节

    file.seek(0);   //把文件指针设置到文件起始处
    //以下从file文件读取数据,要注意指针位置
    System.out.println("-----------从file文件指定位置读取数据--------");
    System.out.println(file.readInt());
    System.out.println(file.readDouble());
    System.out.println(file.readUTF());

    file.skipBytes(3); //文件指针跳过三个字节
    System.out.println(file.readLong());
}

以上是学JAVA IO时自己做的笔记,还有很多不足,自己还需努力。

 

时间: 2024-11-05 16:32:44

java基础-JAVA IO的相关文章

java基础之IO

java基础之IO 1,字节流与字符流常用方法: public class testIO { /** * 字符输入输出流实现文件的复制(类比字节操作) * @throws IOException * */ @Test public void testWriterReaderFileCopy() throws IOException{ Reader read = new FileReader("cyq1.txt"); Writer write = new FileWriter("

java基础篇IO流的规律

前两篇降了IO流中的字节流和字符流复制的例子,今天来总结一下IO流的规律 掌握好IO流的规律,再开发中会很好用 下面来总结一下: 1,明确源和目的 源:输入流 InputStream 和Reader 目的:输出流 OutputStream 和Writer 2,操作的数据是否是纯文本. 是:使用字符流 不是:使用字节流 3,当体系明确后,在明确要使用哪个具体的对象,通过设备来进行区分 源设备: 内存,硬盘,键盘 目的设备: 内存,硬盘,控制台 这里的源就是你想进行的操作,比如说你想从c盘复制一个文

JAVA 基础之 IO复习

一.文件: 在IO包中唯一与文件相关的类就是 File类. File类中常用的常量和方法 1.创建文件: 指定路径和将要创建的文件名字以及类型: 然后调用 createNewFile()方法 File file = new File("D:"+File.separator+"MyJavaProgram"+File.separator+"hello.java"); file.createNewFile(); 2.删除文件: 指定路径和文件,包括类型

Java基础: IO操作

最近抽了点时间回顾了java基础,昨天看了java的IO操作,把大致的总结写在这里. Java的IO操作主要是数据的输入.输出操作和文件管理,输入输出操作可以包括控制台.文件的输入输出和流的输入输出,流的输入输出可以用于文件,也可以用于网络数据. 控制台 控制台的输入输出中,输出大家最熟悉,最常用的就是System.out,那么输入操作可以用System.in,也可以System.console,区别是前者读入字节,后者读入字符串 文件处理 File类:可以实现对文件目录和文件的增删改,查看文件

java基础之IO流(一)

java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典型数据源与目标媒介包括磁盘.网络.内存等等. IO流的分类: 按流向分为:输入流和输出流(本地内存为参考) 按处理数据单位:字符流和字节流 按照是否与特定的地方相连(磁盘.网络.内存):节点流和处理流 节点流:可以从或向一个特定的地方(节点)读写数据. 处理流:是对一个已存在的流的连接和封装,通过所

[Java基础] Java对象内存结构

转载地址:http://www.importnew.com/1305.html 原文于2008年11月13日 发表, 2008年12月18日更新:这里还有一篇关于Java的Sizeof运算符的实用库的文章. 学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制.而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小.C和C++中的这个操作符对于指针运算.内存拷贝和IO操作都非常有用. Java中并没有一个类似的运算符.事实上,Java也不需要这种运

[Java基础] java的守护线程与非守护线程

最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ,(PS:以前忽略了). 估计学过Unix开发但是没有细致学习Java的同学们会疑惑了,操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构 建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,所以它可以在它自己的虚拟的平台里面构造出对自己有利的机制,而语言或者说

[Java基础] Java线程复习笔记

先说说线程和进程,现代操作系统几乎无一例外地采用进程的概念,进程之间基本上可以认为是相互独立的,共享的资源非常少.线程可以认为是轻量级的进 程,充分地利用线程可以使得同一个进程中执行多种任务.Java是第一个在语言层面就支持线程操作的主流编程语言.和进程类似,线程也是各自独立的,有自 己的栈,自己的局部变量,自己的程序执行并行路径,但线程的独立性又没有进程那么强,它们共享内存,文件资源,以及其他进程层面的状态等.同一个进程内的 多个线程共享同样的内存空间,这也就意味着这些线程可以访问同样的变量和

Java基础--Java入门

IsCoder 标记: Java基础,Java环境配置 一.Java环境配置 Java Develop Kit(JDK安装) 系统环境变量设置(JAVA_HOME) Java源程序编辑工具 Java编译运行命令 运行经典的HelloWorld程序 1.1 JDK安装 JDK,就是甲骨文公司提供给我们的Java开发工具包,包括最常用的Javac.exe编译工具和Java.exe运行工具.需要指出的是,JDK中已经包含了JER(Java Runtime Environment,Java运行时环境),

Java基础--Java编程规范

IsCoder 标记: Java基础,Java编程规范 摘要:Java虽然没有强制性的编程规范,但是为了便于统一,Java有不成文的编程规范,为了形成良好的编程习惯,建议熟悉并遵守Java编程规范,提高代码的阅读性. 一.Java标识符 在任何语言中,都要自己的一套标识符规则.Java的标识符包括:Java关键字.Java特殊功能的标识符.合法的用户自定义标识符.其中,我们能改变的只有自定义的标识符,和大部分计算机编程语言一样,Java标识符原始只支持ASCII的编码,但是随着Java在世界的影