文件输入输出流的学习

1.单个字节形式的字节输入输出(效率较低)

(1)单个字节的输入流

package qwe;
import java.io.*;
public class inputStream1 {
public static void main(String[] args) {
FileInputStream in=null;
try {
in=new FileInputStream("a.txt");
int n; //用以接收输入流从文件读取的单个字节, read()函数返回的是字节对应的ascll码,当读不到数据时返回-1
while((n=in.read())!=-1) {
System.out.print((char)n);//将ascall码转化为字节并且输出
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(in!=null) {
try {
in.close();//流的关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

(2)单个字节的输出流

package qwe;

import java.io.FileOutputStream;
import java.io.IOException;
public class outputStream {
public static void main(String[] args) throws IOException {
FileOutputStream ou=new FileOutputStream("b.txt");
for(int i=0;i<10;i++) {     
ou.write(97);
}
}
}

(3)基于单个字节输入输出流的文件复制

FileInputStream in=null;
FileOutputStream ou=null;
try {
in=new FileInputStream("a.txt");  //这是被复制的文件名
ou=new FileOutputStream("b.txt");    //这是复制出的文件的文件名,此处是相对路径,如果需要绝对路径,形式为:"C://Users//user//Desktop//abc.txt"  即可
int n;
while((n=in.read())!=-1) {
ou.write(n);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try{
if(in!=null) {
in.close();
}
if(ou!=null) {
ou.close();
}
}catch (IOException e) {

}

}

注意: 1.ascll码里面并没有中文对应的字节,所以单字节形式的输入输出流无法处理中文等特殊字符的乱码问题

2.GBK每个汉字两个字节,而UTF-8每个汉字三个字节。

3.如果出现乱码则可以用String(byte[] ,"合适的编码方式")或则其他可以自己设置编码的函数

2.字节数组形式的文件输入输出流

(1)多字节输入流

package qwe;
import java.io.*;
import java.lang.reflect.Array;
import java.util.Arrays;
public class inputStream1 {
public static void main(String[] args) {
FileInputStream in=null;
try {
in=new FileInputStream("a.txt");

int n;
byte b[]=new byte[5];   //此处一般写1024 ,但是本人认为即便是1024也不能完全避免中文乱码,因为当文件中文字符多到大于1024字节后,下一次读取也会因为字节分割的问题造成乱码的出现                          
while((n=in.read(b))!=-1) {                         //以字节数组的形式读的话,每次读取的5个字节会放入缓冲区,所以不满5个字节的时候,更新完新前几个字节后,剩下的内容还是上一个5字节的内容,此时的返回值为所读文件的字节个数。
System.out.println(new String(b,0,n));          
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(in!=null) {
try {
in.close();//流的关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

(2)多字节输出流(部分代码)

public class outputStream {
public static void main(String[] args) throws IOException {
FileOutputStream ou=new FileOutputStream("b.txt");
for(int i=0;i<10;i++) {
ou.write("he真实的\r\n".getBytes());         //在windows系统下用/r/n来表示的换行。
}
}

(3)多字节的文件复制

public void test() {
FileInputStream in=null;
FileOutputStream ou=null;
try {
in=new FileInputStream("a.txt");
ou=new FileOutputStream("b.txt");
byte a[]=new byte[1024];
int n;
while((n=in.read(a))!=-1) {
ou.write(a,0,n);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try{
if(in!=null) {
in.close();
}
if(ou!=null) {
ou.close();
}
}catch (IOException e) {
}
}
}
}

注意:

1.FileInputStream每次都是从硬盘读入,而BufferedInputStream大部分是从缓冲区读入。读取内存速度比读取硬盘速度快得多,因此BufferedInputStream效率高。
  BufferedInputStream的默认缓冲区大小是8192字节。当每次读取数据量接近或远超这个值时,两者效率就没有明显差别了。

原文地址:https://www.cnblogs.com/icxl/p/10469698.html

时间: 2024-11-13 10:58:24

文件输入输出流的学习的相关文章

java中常见的输入输出流案例学习

字节输入流: 1.FileInputStream 用途:从文件系统中的文件获得输入字节,常用于读取图像.声音等原始字节流,读取字符流可考虑使用FileReader 详细构造函数与常用方法可参考API文档,网上已经有中文版的API了,我是个E文盲,伤不起 这里介绍一个最常见的方法: read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中. ->off:b字节数组中的偏移量 小知识:数组偏移量,比如a[1,2,3,4,5]

c++文件输入输出流fstream,对输入&gt;&gt;和输出&lt;&lt;重载

1. fstream 继承自iostream --> 要包含头文件#include<fstream> 2. 建立文件流对象 3. 打开文件夹 4. 测试是否打开成功 5. 进行读写操作 6. 关闭文件 #include<iostream> #include<fstream> using namespace std; int main(){ ifstream ifile; ofstream ofile; ifile.open("d:\\fileIn.txt

文件输入输出流工具: IOUtils使用总结

文件输入输出流工具: IOUtils使用总结 以前写文件的复制很麻烦,需要各种输入流,然后读取line,输出到输出流...其实apache.commons.io里面提供了输入流输出流的常用工具方法,非常方便.下面就结合源码,看看IOUTils都有什么用处吧! 本文系转载,原作者:xingoo 出处:http://www.cnblogs.com/xing901022 常用的静态变量 在IOUtils中还是有很多常用的一些变量的,比如换行符等等 public static final char DI

java文件输入输出流学习笔记

--java创建文件 File file=new File("java.txt");//此时java工作空间根目录下不一定存在java.txt //判断是否存在不存在调用File类的createNewFile方法创建java.txt File files=new File("E:\\war3"); if(!file.exists()){ file.createNewFile(); } System.out.println(file.exists());//判断文件是

【Java】利用文件输入输出流完成把一个文件夹内的所有文件拷贝的另一的文件夹的操作

一.基本目标 使用Java完成如下的操作: 把一个文件夹内的所有文件拷贝的另一的文件夹,例如,在F盘中有a与b两个文件夹: f:/a里面有一堆文件,运行Java程序之后就会全部复制到f:/b,并且完成重命名,在所有文件之前加rename_的前缀,如果里面有文件夹,则文件夹不重命名,里面的文件进行重命名,同样在所有文件之前加rename_的前缀: 二.制作过程 1.首先主函数非常简单,就是调用了上面FileTest类中的copyFolder函数 public class FileCopy { pu

文件输入输出流

一,FileInputStream public static void fileinputstreamDemo(){ File file=new File("F:\\filetest\\file01.txt"); try { FileInputStream in=new FileInputStream(file); byte[] bytes=new byte[1024]; int total = in.read(bytes); System.out.println("读出来

对c++ primer中 io文件输入输出流的理解

ifstream input_file("abcd.txt"); 创建一个输出流input_file流绑定到后缀txt的文件上,那么input_file就是一个输出流   相当与cin(cin >> s) 那么我们就可以用input_file >> s来代替cin,只不过cin是从键盘上输入,而input_file是从文件中读取的数据. ofstream out_file("out_file.txt"); 同理这里out_file等同于cou

java Io文件输入输出流 复制文件

package com.hp.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class InputAndOutputFile{ //都是纯手打  如果复制显示不能复制 也懒得改  手敲 格式不好看见谅 public static void main(String

Java 复制文件 (文件输入输出流)

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class CopyFileDemo