java学习之输入,输出流
输入流与输出流
1,流的分类:字节流和字符流 区别如下:
1,字节流(8位Unicode)在操作的时候本身是不会用到缓冲区(内存)的byte,是与文件本身直接操作的,而字符流(16位Unicode)在操作的时候是使用到缓冲区的char
2,字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,
并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
3,在所有的硬盘上保存文件或进行传输的时候都是以字节的方法进行的,包括图片也是按字节完成,而字符是只有在内存中才会形成的,所以使用字节的操作是最多的。
2,File类

3,I\O流
1,
输入流:从其他数据源写入到代码内存
输出流:从代码内存写入到指定数据源中
2,流分类:
1,节点流有:FileInputStream,FileReader,ArrayInputStream等,对接数据源
处理流:套接在节点流(或处理流)之上的
2,缓存流有:BufferedInputStream,BufferedReader等加快读写速率
3,数据流有:DataInputStream减少数据类型的转换,在网络编程多
4,对象流有:ObjectInputStream,需要对对象序列化,网络编程多
5,打印流有:Print,控制输入,输出的目的地。
3,案例
3.1 字节流进行文件copy
static void testByte(String source ,String target){
final int SIZE=1024;
try {
InputStream in=new FileInputStream(source);// 快捷键:ctrl+alt+t try..catch
BufferedInputStream bufIn=new BufferedInputStream(in,SIZE);
OutputStream out=new FileOutputStream(target,true);
BufferedOutputStream bufOut=new BufferedOutputStream(out);
byte [] byteArr=new byte[SIZE];// if inbuf.size>byte.length ,will have Exception:String index out of range: 105
int len;
while((len=bufIn.read(byteArr))!=-1){
//in.read(buf) 注意点:read()为原生方法,该方法能记录住你上次读取的位置,所以while不会每次都重头开始读文件
//in.read(buf) 将读取的文件字节保存到buf中,并返回读取了多少字节
//Buffer的作用即将文件中先读入缓存,需要先满足Buff的数组容量,(所以byteArr的容量要大于BuffSize)然后将缓存中一起读入byteArr中,
避免一字节一字节来读到byteArr中
bufOut.write(byteArr,0,len);//如果没有len,会按SIZE来写,不足用NULL填充
}
bufOut.flush();
bufOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3.2 字符流进行文件copy
//通过字符进行copy文件,使用Buffer和File
static void testChar(String source ,String target){
final int SIZE=1024;
try {
Reader in=new FileReader(source);// 快捷键:ctrl+alt+t try..catch
BufferedReader bufIn=new BufferedReader(in,SIZE);
Writer out=new FileWriter(target, true);//是否对文件进行追加处理
BufferedWriter bufOut=new BufferedWriter(out);
String temp;
bufOut.write("使用字符操作的结果");
while((temp=bufIn.readLine())!=null){
bufOut.write(temp);//不包括换行符,这里
bufOut.newLine();//没该句就不会换行
}
bufOut.flush();
bufOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3.3 byteArray和DataInput测试
//数据流 byteArray和Data
static void testByteData(){
ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
DataOutputStream dataOut=new DataOutputStream(byteOut); try {
dataOut.writeUTF("你好啊");//用writeChars,导致后面无法读
dataOut.writeDouble(0.33334);
dataOut.close();
System.out.println(byteOut.size()+""+byteOut.toByteArray().length);//19 19即字节的个数
ByteArrayInputStream byteIn=new ByteArrayInputStream(byteOut.toByteArray());//需要在写完后读,即需要读取最新的
DataInputStream dataIn=new DataInputStream(byteIn);
System.out.println(dataIn.readUTF());
System.out.println(dataIn.readDouble());
dataIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3.4 File字节流和Data字符流
//数据流 Data和File
static void testeFileData(String target){
String[] name={"知识","zsf","succ"};
double[] hig={13.4,34.4,43,24};
int[] age={34,243,34};
try {
OutputStream out=new FileOutputStream(target);
BufferedOutputStream buf=new BufferedOutputStream(out,1024);
DataOutputStream dataOut=new DataOutputStream(buf);
for(int i=0;i<3;i++){
dataOut.writeUTF(name[i]);
dataOut.writeChar('\t');
dataOut.writeDouble(hig[i]);
dataOut.writeChar('\t');
dataOut.writeInt(age[i]);
dataOut.writeChar('\n');
}
dataOut.close();
InputStream in=new FileInputStream(target);
BufferedInputStream bufIn=new BufferedInputStream(in,1024);
DataInputStream dataIn=new DataInputStream(bufIn);
String str=null;
for(int i=0;i<3;i+=1){//需要事先知道文件中存储的格式和行数
System.out.print(dataIn.readUTF());
dataIn.readChar();
System.out.print(dataIn.readDouble());
dataIn.readChar();
System.out.print(dataIn.readInt());
dataIn.readChar();
}
} catch (IOException e) {
e.printStackTrace();
}
}
3.5 对象流和byteArray流
void testObjectByte(){
User user1=new User("知识",4);
User user2=new User("知识",4);
ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
try {
ObjectOutputStream objOut=new ObjectOutputStream(byteOut);
objOut.writeObject(user1);
objOut.writeObject(user2);
byte[] data=byteOut.toByteArray();//
ByteArrayInputStream byteIn=new ByteArrayInputStream(data);
ObjectInputStream objIn=new ObjectInputStream(byteIn);
User u=(User)objIn.readObject();
System.out.println(u.age+"\t"+u.name);
System.out.println(objIn.readObject());
} catch (Exception e) {
e.printStackTrace();
}
}
class User implements Serializable{
private static final long serialVersionUID = 1L;
public String name;
public int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return name+"\t"+age;
}
}
3,6 文件流和对象流
class User implements Serializable{
private static final long serialVersionUID = 1L;
public String name;
public int age;
public User(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return name+"\t"+age;
}
}
//对象流和文件 字符型没有该方法
void testObjectFile(String source){
User user1=new User("你好",5);
User user2=new User("你好",5);
try {
OutputStream outputStream=new FileOutputStream(source);
ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(user1);
objectOutputStream.writeObject(user2);
InputStream inputStream=new FileInputStream(source);
ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
User user=(User)objectInputStream.readObject();
System.out.println(user.name+"\t"+user.age);
System.out.println(objectInputStream.readObject());
} catch (Exception e) {
e.printStackTrace();
}
}
3.7 转换流
//转换流
static void testSteamReader(String source,String target){
try {
InputStream in=new FileInputStream(source);
Reader reader=new InputStreamReader(in,"utf-8");
BufferedReader bufRead=new BufferedReader(reader);
CharArrayWriter charArr=new CharArrayWriter();
FileWriter writer=new FileWriter(target);
String line;
while((line=bufRead.readLine())!=null){
System.out.println(line+"okl");
charArr.write(line);
System.out.println(charArr.toString());
writer.write(line);
} } catch (Exception e) {
e.printStackTrace();
}
}
4 小结
1,关键总结输出流和输入流
2,节点流和处理流的应用场景
3,多看api
java学习之输入,输出流的更多相关文章
- java学习笔记-输入输出流
================File类 =====================InputStream ==================OutputStream ============== ...
- 第27章 java I/O输入输出流
java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...
- Java复习7.输入输出流
Java复习7.输入输出流 20131005 前言: Java中涉及数据的读写,都是基于流的,这一块的知识相当重要,而且在Java中的数据,char字符是16bit的,所以存在字节流和字符流的区别.如 ...
- JAVA Io 缓冲输入输出流
java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...
- Java I/O输入输出流详解
一.文件的编码 开发时一定要注意项目默认的编码!!!!!!!! 文件操作的时候一定要记得关闭!!!!!!!! ASCII:美国标准 ...
- java实验8-Java输入输出流
1 读写文件 [实验目的] (1)掌握文本文件的读写方法. (2)掌握随机文件的读写方法. (3)掌握InputStream.OutputStream抽象类的基本使用. (4)掌握FileInputS ...
- Java工具类-输入输出流
输入输出流 1.概念 输入输出流:文件复制,上传 输出流: System.out.println() 写操作,程序将字符流写入到"目的地",比如打印机和文件等 输入流 :Scann ...
- Java中的输入输出流
FileInputStream和FileOutputStream 创建含磁盘文件的输入 输出流对象. FileInputStream继承自InputStream,用于读取本地文件中的字节数据,由于所有 ...
- 《三》Java IO 字节输入输出流
那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream) ...
随机推荐
- 2016华中农业大学预赛 E 想法题
Problem E: Balance Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 205 Solved: 64[Submit][Status][We ...
- 石子归并的三种打开方式——难度递增———51Node
1021 石子归并 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. ...
- 在GitHub多个帐号上添加SSH公钥
GitHub后台可以添加多个SSH Keys,但是同一个SSH Keys只能在添加在一个帐号上(添加时提示“Key is already in use”).理由很容易想到,SSH公钥使用时相当于用户名 ...
- 记录string的妙用
P1106 删数问题 摘要 --> 题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的 ...
- roadhogrc.mock.js配置
1.roadhogrc.mock.js const fs=require('fs'); const path=require('path'); const mockPath=path.join(__d ...
- react 使用Form组件如何清空上一次操作
最近在做一个表单联查时候,总是会发现后一个选择器会记住上一次选择的值 ,这会导致前一级选择器已经做出更新后,后一级选择器却还记住上一次的操作, 这里有个方法可以在上级选择器事件操作时清空Form组件的 ...
- 二分LIS模板
假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5. 下面一步一步试着找出它. 我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列. ...
- ACM阶段总结(2016.10.07-2016.11.09)
来这里也有一段时间了…… 总感觉自己练得不是很有效. 最近的一些行动就是不断做比赛,然后不停地补,但是感觉这样像只无头苍蝇,没有效果,学不到什么真正的东西. 最近开始打算补专题,做做codeforce ...
- Python的网络编程[0] -> socket[1] -> socket 模块
socket 1. 常量 / Constants AF_* 和 SOCK_* 分别属于 AddressFamily 和 SocketType 1.1 AF_*类常量 socket.AF_UNIX: ...
- Codeforces 600E - Lomsat gelral(树上启发式合并)
600E - Lomsat gelral 题意 给出一颗以 1 为根的树,每个点有颜色,如果某个子树上某个颜色出现的次数最多,则认为它在这课子树有支配地位,一颗子树上,可能有多个有支配的地位的颜色,对 ...