Java学习笔记之IO补充
来源:互联网 发布:错生网络剧 编辑:程序博客网 时间:2024/05/22 03:26
随着对文件学习的深入,我们开始学习到了关于对IO流的一些操作,主要是通过以下几个类进行学习的
1.LineNumberReader
public class LineNumberReaderextends BufferedReader
跟踪行号的缓冲字符输入流。
对于它的使用主要用到两个方法:
* public int getLineNumber():获取行号
* public void setLineNumber(int lineNumber):设置起始行号
具体使用如下:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
/** 案例:读取文件,每次读取一行打印并且加上行号 * */ public class LineNumberReaderDemo { public static void main(String[] args) throws IOException { LineNumberReader lnr = new LineNumberReader(new FileReader("copy.txt")); int lineNumber = lnr.getLineNumber(); System.out.println(lineNumber); // lnr.setLineNumber(3); String line; while((line = lnr.readLine()) != null){ System.out.println(lnr.getLineNumber() + ": " + line); } } }
2.操作基本数据类型的流
- 可以操作基本类型的流对象。
- DataInputStream:读数据
- DataOutputStream:写数据
-
案例:给流中写基本类型的数据,并且读取
注意: 读写顺序必须一致,否则数据有问题。
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/**
案例:给流中写基本类型的数据,并且读取
注意:- 读写顺序必须一致,否则数据有问题。
*
*/
public class DataOutputStreamDemo {
public static void main(String[] args) throws IOException {
//写数据
write();
read();
}private static void read() throws IOException { //DataInputStream:读数据 //创建对象:public DataInputStream(InputStream in) DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt")); //读数据了,按什么顺序写入就必须按照什么顺序读出来 System.out.println(dis.readByte()); System.out.println(dis.readShort()); System.out.println(dis.readInt()); System.out.println(dis.readLong()); System.out.println(dis.readChar()); System.out.println(dis.readFloat()); System.out.println(dis.readDouble()); System.out.println(dis.readBoolean()); //关流 dis.close();}private static void write() throws IOException { //public DataOutputStream(OutputStream out) DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt")); //给流关联的文件中写入基本类型的数据 dos.writeByte(20); dos.writeShort(200); dos.writeInt(2000); dos.writeLong(20000L); dos.writeChar(97); dos.writeFloat(12.34F); dos.writeDouble(23.34); dos.writeBoolean(true); //关流 dos.close();}
}
3.内存操作流:
解决临时数据存储的问题。
此类类有
A.操作字节数组:ByteArrayInputStream,ByteArrayOutputStream
B.操作字符数组:CharArrayReader,CharArrayWrite
C.操作字符串:StringReader,StringWriter
以ByteArrayInputStream类为例,它包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪read方法要提供的下一个字节。关闭ByteArrayInputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
ByteArrayOutputStream类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和toString()获取数据。关闭ByteArrayOutputStream无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
其他类和他们类似。
4.打印流
字节打印流 PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream;这意味着可在写入 byte 数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个换行符或字节 (‘\n’)。PrintStream打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。字符打印流 PrintWriter
特点:
A:只能操作目的地,不能操作数据源
B:可以操作任意类型的数据
C:如果启动了自动刷新,能够自动刷新
D:可以操作文件的流
下面用一个复制文件的案例来证明一下PrintStream和PrintWriter的方便之处:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;public class CopyJavaDemo { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("d://TestTime.java")); PrintWriter pw = new PrintWriter(new FileWriter("TestTime2.java"), true); String len; while((len = br.readLine()) != null){ pw.println(len);//1.写数据 2.换行 3.刷新 } br.close(); pw.close(); }}
5.标准输入输出流
System类下有这样的两个成员变量:标准输入流:
public static final InputStream in案例1:利用标注输入流进行键盘录入,录入后读取流并打印在控制台
import java.io.IOException;
import java.io.InputStream;public class SystemIn { public static void main(String[] args) throws IOException { //Scanner sc = new Scanner(System.in);底层还是输入流 InputStream is = System.in;//将键盘录入封装成输入流 int by; while((by = is.read()) != -1){ System.out.print((char)by); } is.close(); }}
案例2:用IO流实现键盘录入,一次读取一行数据
分析:
InputStream is = System.in;
BufferedReader是字符缓冲流,是对字符流进行高效操作的
所以,参数必须是字符类型
而我们现在有的是字节类型的流
请问:怎么办呢?转换流
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class SystemInDemo2 { public static void main(String[] args) throws IOException { //用io流实现键盘录入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入姓名"); String name = br.readLine(); System.out.println(name); System.out.println("请输入年龄"); String age = br.readLine(); System.out.println(age); br.close(); } }
标准输出流:
public static final PrintStream out案例:解析输出语句System.out.println(“helloworld”);
import java.io.PrintStream;public class SystemOutDemo { public static void main(String[] args) { PrintStream ps = System.out; ps.println(true);//等同于System.out.println(); }}
- 合并流:
SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。
构造:
SequenceInputStream(InputStream s1, InputStream s2) :将s1和s2合并成一个输入流,先读取s1后读取s2- Properties(查看api实现map接口本质是一个map集合)
7.1
Properties:Properties 类表示了一个持久的属性集。属性列表中每个键及其对应值都是一个字符串。
特点:Properties 可保存在流中或从流中加载。
案例:使用map集合的put方法给集合中存储数据并且遍历
7.2
Properties的特有功能:
A:添加元素
public Object setProperty(String key,String value)
B:获取元素
public String getProperty(String key)
public Set stringPropertyNames()
案例:使用它的特有功能添加元素并遍历7.3
可以和IO流进行结合使用:
把文件中的数据加载到集合中。注意:文件中的数据必须是键值对象形式的(例如:张杰=谢娜)。
public void load(InputStream inStream)
public void load(Reader reader)
案例:创建一个键值对文件,将文件中的键值对加载到集合中,输出集合把集合中的数据存储到文本文件中,并且是按照键值对形式存储的。public void store(OutputStream out,String comments)public void store(Writer writer,String comments)案例:将创建的键值对集合加载到文件中
- 读写顺序必须一致,否则数据有问题。
案例:我有一个猜数字小游戏的程序,请写一个程序实现在测试类中只能用5次,
超过5次提示:游戏试玩已结束,请付费。
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
/** * 我有一个猜数字小游戏的程序,请写一个程序实现在测试类中只能用5次, 超过5次提示:游戏试玩已结束,请付费。 */ public class PropertiesDemo { public static void main(String[] args) throws Exception{ Properties prop = new Properties(); prop.load(new FileReader("count.txt")); Integer number = Integer.valueOf(prop.getProperty("count")); number++; if(number>2){ System.out.println("试玩结束,请付费!"); System.exit(0); }else{ prop.setProperty("count", String.valueOf(number)); prop.store(new FileWriter("count.txt"), null); System.out.println("第"+number+"次试玩"); GuessNumber.startGame(); } } }
- Java学习笔记之IO补充
- Java学习第21天:IO流之知识补充
- java学习之补充新知识-文件传输 IO流
- Java学习笔记之IO
- 20---IO学习笔记(补充)
- JAVA-14.1-IO流之知识点补充
- java学习笔记之IO流
- 学习之Java IO的笔记
- 黑马程序员---java学习笔记之IO
- java学习笔记之IO流
- [学习笔记]Java IO之文件
- [学习笔记]Java IO之字节流
- [学习笔记]Java IO之字符流
- Java学习笔记之IO 1
- Java学习笔记之IO 2
- Java学习笔记之IO 3
- Java学习笔记之IO 4
- java IO 学习笔记之FIle
- 使用Servlet实现文件上传功能
- Android开发教程:理解Intent和Intent Filter
- 简单的手风琴JS效果实现
- Cannot create a server using the selected type
- 什么是PID控制中的超调
- Java学习笔记之IO补充
- 剑指Offer-删除链表中重复的结点
- Educational Codeforces Round 21 B.Average Sleep Time 前缀和,双指针
- Java反射机制
- AtomicInteger类和int原生类型自增鲜明的对比
- 在Oracle Linux中可以禁用ssh的同时启用scp么?
- MySql中的多列索引
- JavaScript中const,var,let区别
- 洛谷5月月赛R1题解报告