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) ...
随机推荐
- 2017 多校5 Rikka with String
2017 多校5 Rikka with String(ac自动机+dp) 题意: Yuta has \(n\) \(01\) strings \(s_i\), and he wants to know ...
- 【CZY选讲·一道图论好题】
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,不仅有边权还有点权.LYK给出了一个子图的定义,一张图G'={V',E'}被称作G的子图,当且仅当: · ...
- select下拉框右对齐,去掉箭头,替换箭头
右对齐 select{ width:auto; direction: rtl; } select option { direction: ltr; } 去掉箭头(不设置背景色会有灰色背景) selec ...
- java泛型的一些解释
public <A extends Annotation> A getAnnotation(Class<A> annotationClass)我们经常在帮助文档中看到这样的方法 ...
- query的list()和iterate()区别 面试题
query的list()和iterate()区别 1.返回的类型不一样,list返回List,iterate返回iterator 2.查询策略不同. 获取数据的方式不一样,list会直接查询数据库,i ...
- SQL的四种连接查询(转)
原文转自 https://blog.csdn.net/wangjingna/article/details/48765931
- Python学习杂记_14_模块(二)_常用模块
常用模块 random 模块 import random print(random.random()) # 随机浮点数,默认取0-1,不能指定范围 print(random.randint(1, 20 ...
- 我从16ASPX上下了一个程序在运行时出错是怎么回事?运行时出现用户SA登陆失败,但是我已经把数据库导入SQL
如果你账号密码正确,那你可能没有打开你的管线服务,或者没有配置好你的客户端
- 计蒜客 25985.Goldbach-米勒拉宾素数判定(大素数) (2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 B)
若干年之前的一道题,当时能写出来还是超级开心的,虽然是个板子题.一直忘记写博客,备忘一下. 米勒拉判大素数,关于米勒拉宾是个什么东西,传送门了解一下:biubiubiu~ B. Goldbach 题目 ...
- 51nod 1004 n^n的末位数字【快速幂】
1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 给出 ...