可能你只想简单的使用,暂时不想了解太多的知识,那么请看这里,了解一下如何读文件,写文件
读文件示例代码
复制 File file = new File("D:\\test\\t.txt"); //这里的有两条斜杠,其实实际的路径为D:\test\t.txt,多的那一条斜杠是转义用的 InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file), "GBK"); //利用之前的File对象,创建了一个`FileInputStream`对象,之后作为InputStreamReader的构造方法参数传入 //第二个参数是编码,一般使用GBK或者是UTF-8 BufferedReader reader = new BufferedReader(inputStreamReader); //把InputStreamReader作为参数构造一个BufferedReader String s; while((s=reader.readLine())!=null){ System.out.println(s);//循环,将该文件里面的内容全部打印出来 }
写文件示例代码
与上面的类似,解释就不多写啦
复制 File file = new File("Q:\\t.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "GBK"); BufferedWriter writer = new BufferedWriter(outputStreamWriter); writer.write("hello world"); writer.close();//必须要调用close才能成功地将内容写入文件
文件不存在的话会自动生成该文件,但是如果是带有文件夹的话,就得考虑到文件夹不存在的情况
例如:
复制 File file = new File("Q:\\test\\t.txt"); File temp = file.getParentFile(); if (!temp.exists()) { temp.mkdirs();//文件夹不存在,则新建一个文件夹 } OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "GBK"); BufferedWriter writer = new BufferedWriter(outputStreamWriter); writer.write("hello world"); writer.close();
复制文件
这里使用的是字节流,把t.txt复制到Q盘中的MY文件夹中,并改名
复制 FileInputStream inputStream = new FileInputStream("Q:\\t.txt"); FileOutputStream outputStream = new FileOutputStream("Q:\\MY\\t1.txt"); int c; //读到尾部则是返回-1 while ((c = inputStream.read()) != -1) { outputStream.write(c); } inputStream.close(); outputStream.close();
PS:这里和之前一样,如果文件夹不存在,就得调用mkdirs方法进行创建文件夹的操作,除了txt文件,其他的文件也是可以这样复制
File类(文件类)
File对象代表磁盘中实际存在的文件和目录
静态属性
File.separator 分隔符 windows操作系统是\
,linux操作系统则是/
构造方法
- File(File parent, String child) 通过给定的父抽象路径名和子路径名字符串创建一个新的File实例
- File(String pathname) 通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
常用方法
- public String getName() 返回由此抽象路径名表示的文件或目录的名称。
- public String getParent() 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null
- public File getParentFile() 返回此抽象路径名的父路径名的抽象路径名的file对象,如果此路径名没有指定父目录,则返回 null
- public String getPath() 将此抽象路径名转换为一个路径名字符串
- public boolean exists() 判断此抽象路径名表示的文件或目录是否存在
- public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录
- public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
- public boolean delete() 删除此抽象路径名表示的文件或目录
- public boolean mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
- public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件
IO流笔记
主要的还是两种,字节流和 字符流
所有的文件在硬盘或在传输时都是以字节的方式进行,包括图片等,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
字节流
1.InputStream(输入)
- FileInputStream(主要)
- ByteArrayInputStream
- ObjectInputStream
-
PidedinputStream
2.OuputStream(输出)
- FileOutputStream(主要)
- ByteArrayOutputStream
- ObjectOutputStream
-
PidedOutputStream
字符流
1.Reader(输入)
- FileReader
- CharArrayReader
- PipedReader
-
StringReader
2.Writer(输出)
- FileWriter
- CharArrayWriter
- PipedWriter
-
StringWriter
缓冲流
上面字节流和字符流一般不会直接使用,实际上,缓冲流是一个装饰类,可以给字符流和字节流添加缓冲这功能。
BufferReader
BufferWriter
其实这两个也是包括在字符流里面的
使用的时候传入一个Writer或者是Reader对象即可
复制BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter()); BufferedReader bufferedReader = new BufferedReader(new FileReader());
异常处理笔记
1. try把reader,writer等对象放在括号内,可以自动关闭输入/输出流,并释放资源(输出流会自动调用close方法)
如果有多个资源,使用分号隔开
ps: jdk1.7+支持
例如:
复制try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(""))){ ... }catch(Excetion e){ ... }
2. 可以使用|
来捕获多个异常
复制try{ ... }catch(NullPointerException | ArrayIndexOutOfBoundsException e){ //捕获了两个异常 }
使用字节流获取图片
复制URL url = new URL("http://wx3.sinaimg.cn/large/00689t5lgy1g11hi5nzmtg30m80jghe3.gif"); URLConnection connection=url.openConnection();//打开链接 InputStream inputStream = connection.getInputStream(); BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File("e:\\wan\\download.gif"))); int c; byte[] temp = new byte[1024 * 2];//提供个缓冲区 while ((c = bufferedInputStream.read(temp)) != -1) { bufferedOutputStream.write(temp,0,c);//读多少,写多少 } bufferedOutputStream.close(); inputStream.close();
使用字节流转字符流获取网页内容
基本如上面代码一样,只是输出的时候需要使用bufferwriter输出
ObjectInputStream和ObjectOutStream
序列化和反序列化
序列化:把内存中的序列对象保存在二进制文件中
反序列化:把二进制文件读取,获得原来的文件
需要类实现序列化接口serializable
标识接口里面没有任何的内容
transient关键字 可以让类的某个属性在序列化的过程中不进行写入
复制List<Book> books = new ArrayList<>(); for (int i = 0; i < 5; i++) { Book book = new Book("机战风暴"+i,"乱",56); books.add(book); } ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("e:\\out.bin"))); } catch (IOException e) { e.printStackTrace(); } for (Book book : books) { objectOutputStream.writeObject(book); } objectOutputStream.writeObject(null);//写入一个null,防止之后出现EOFException objectOutputStream.close(); ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("e:\\out.bin"))); Object o = null; try { while ((o = objectInputStream.readObject()) != null) { Book book = (Book) o; System.out.println(book.toString()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }