- LineNumberReader:
- public int getLineNumber():獲取行號
- public void setLineNumber(int lineNumber):設置起始行號
String readLine():讀取一行
案例:讀取文件,每次讀取一行打印並且加上行號
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("a.txt"));
String line;
while ((line = lnr.readLine())!=null) {
System.out.println(lnr.getLineNumber()+":"+line);
}
lnr.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
注意: 如果你沒有設置行號的,默認從0開始,如果設置行號後,則從設置的行號開始算起
2.操作基本數據類型的流
* 可以操作基本類型的流對象。
* DataInputStream:讀數據
* DataOutputStream:寫數據
*
案例:給流中寫基本類型的數據,並且讀取
強調: 讀寫順序必須一致,即當你向文件中寫入數據的時候,寫的什麼數據類型,讀的時候就必須用什麼數據類型去讀,不然會出現錯誤
public class DataOutputStreamDemo {
public static void main(String[] args) throws IOException {
read();
}
private static void read() throws IOException {
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 {
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
3.
內存操作流:解決臨時數據存儲的問題。
操作字節數組(演示着一個案例即可)
ByteArrayInputStream
ByteArrayOutputStream
byte[] toByteArray() 將之前寫入內存的流轉換成字節數組
注意:在寫入文件的時候,是直接將文件寫入內存中,寫的時候可以用不同的方式,在讀取的時候,必須將寫入文件的數據封裝成相應的數組,這樣才能讀取出來的
操作字符數組
CharArrayReader
CharArrayWrite
操作字符串
StringReader
StringWriter
操作字節數組
ByteArrayInputStream
ByteArrayOutputStream
將數據寫到流中保存在內存,並且讀取
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ByteArrayOutputStreamDemo {
public static void main(String[] args) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write("hello".getBytes());
byte[] buf = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
int by;
while ((by=bais.read())!=-1) {
System.out.print((char)by);
}
bais.close();
baos.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
4.
* 打印流:
* 字節打印流 PrintStream
* 字符打印流 PrintWriter
*
- 特點:
- A:只能操作目的地,不能操作數據源
- B:可以操作任意類型的數據
- C:如果啓動了自動刷新,能夠自動刷新
- D:可以操作文件的流
- 注意:什麼流可以直接操作文件?
看流對象的API,如果其構造方法同時有File和String類型的參數,就可以直接操作文件。
案例1:利用字符打印流給文件中書寫數據(String類型),需要手動刷新
import java.io.IOException;
import java.io.PrintWriter;
public class PrintWriterDemo {
public static void main(String[] args) throws IOException {
PrintWriter pw = new PrintWriter("pw.txt");
pw.write("hello");
pw.write("java");
pw.write("world");
pw.flush();
pw.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
此時,我們沒有開啓自動刷新功能。
* 如何啓動自動刷新:利用構造
* PrintWriter(OutputStream out, boolean autoFlush)
* PrintWriter(Writer out, boolean autoFlush)
* boolean autoFlush :需要傳遞一個Boolean類型的參數,當傳遞進來的參數爲True時,表示自動刷新已經開始
* 如果啓用了自動刷新,則只有在調用 println、printf 或 format 的其中一個方法時纔可能完成此操作
* println():如果啓動了自動刷新,能夠實現刷新,而且還實現了自動換行。
案例2:利用字符流給文件中寫數據(int類型,boolean類型),啓動自動刷新
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class PrintWriterDemo2 {
public static void main(String[] args) throws IOException {
PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
pw.println("hello");
pw.println("java");
pw.println("world");
pw.println(true);
pw.println(12.34);
pw.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
**強調:實現自動刷新必須要倆個條件:1,必須利用
PrintWriter(OutputStream out, boolean autoFlush)
* PrintWriter(Writer out, boolean autoFlush) 的構造方法
* 2.必須在調用 println、printf 或 format 的其中一個方法時纔可以開啓自動刷新
3.當調用上面三個其中一個方法時,他會完成的操作是:
1.寫入代碼 2.換行 3 .自動刷新
:**
5.標準輸入輸出流
* System類下有這樣的兩個成員變量:
import java.io.IOException;
import java.io.InputStream;
public class SystemIn {
public static void main(String[] args) throws IOException {
/**
* public static final InputStream in
*/
InputStream is = System.in;
int by;
while ((by=is.read())!=-1) {
System.out.print((char)by);
}
is.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
案例2:用IO流實現鍵盤錄入,一次讀取一行數據
分析:由於是每次讀取一行,所以我們可以BuffferedReader()
InputStream is = System.in;
此時讀取的是字節流,而BufferedReader()需要的是字符流,
所以傳遞進來的參數必須是字符流,因此我們需要將字節流轉換成字符流 InputStreamReader()
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class SystemIn2 {
public static void main(String[] args) throws IOException {
/**
* 案例2:用IO流實現鍵盤錄入,一次讀取一行數據
* InputStream is = System.in;
* InputSreamReader isr = new InputStreamReader(is)
* BufferedReader br = new BufferedReader(isr);
*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("請輸入你的姓名");
String name = br.readLine();
System.out.println("請輸入你的年齡");
String age = br.readLine();
System.out.println(name+":"+age);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
案例:解析輸出語句System.out.println(“helloworld”);
import java.io.PrintStream;
/**
* 標準輸出流:
* public static final PrintStream out
*
*/
public class SystemOut {
public static void main(String[] args) {
System.out.println(true);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
注意:這句語句的本質是System中有一個out的靜態字段,所以我們可以通過System調用out字段,返回一個標準的輸出類,然後再調用println()方法,打印數據
6.
* 合併流:SequenceInputStream類可以將多個輸入流串流在一起,合併爲一個輸入流,因此,該流也被稱爲合併流。
構造:
SequenceInputStream(InputStream s1, InputStream s2) :將s1和s2合併成一個輸入流,先讀取s1後讀取s2
- 案例1:
- 我要把a.txt和b.txt寫到一個文件copy.txt
- a.txt
- b.txt
- 目的地:
- copy.txt
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
public class SequenceInputStreamDemo {
public static void main(String[] args) throws IOException {
SequenceInputStream sis = new SequenceInputStream(new FileInputStream("a.txt"), new FileInputStream("b.txt"));
FileOutputStream fos = new FileOutputStream("copy2.java");
byte[] buf = new byte[1024];
int len;
while ((len=sis.read(buf))!=-1) {
fos.write(buf, 0, len);
}
fos.close();
sis.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
-
對象的序列化和反序列化
1。先創建出一個學生類
import java.io.Serializable;
public class Studnet implements Serializable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Studnet(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Studnet() {
super();
}
@Override
public String toString() {
return "Studnet [name=" + name + ", age=" + age + "]";
}
}
2. 利用序列化流將對象寫入文本中
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamDemo {
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
Studnet s = new Studnet("劉德華", 50);
oos.writeObject(s);
oos.close();
}
}
3.利用反序列化流將存儲到文件的對象讀取出來
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class ObjectInputStreamDemo {
public static void main(String[] args) throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
Object object = ois.readObject();
System.out.println(object);
ois.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
注意:如果一個類不是實現Serializable接口無法把實例化,會拋出異常Java.io.NotSerializableException
類通過實現 java.io.Serializable 接口以啓用其序列化功能。未實現此接口的類將無法使其任何狀態序列化或反序列化,所以我們可以通過讓對象的所屬類來實現序列化西街口
- Properties
- Properties:Properties 類表示了一個持久的屬性集。
- 屬性列表中每個鍵及其對應值都是一個字符串。
- 特點:Properties 可保存在流中或從流中加載。
案例:使用map集合的put方法給集合中存儲數據並且遍歷
import java.util.Properties;
import java.util.Set;
public class ProppertiesDemo {
public static void main(String[] args) {
Properties prop = new Properties();
prop.put("zhangjie", "xiena");
prop.put("huangxiaoming", "baby");
prop.put("wanglaoshi", "zhangziyi");
Set<Object> keys = prop.keySet();
for (Object key : keys) {
System.out.println(key+":"+prop.get(key));
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
9.2
* Properties的特有功能:
* A:添加元素
* public Object setProperty(String key,String value)
* B:獲取元素
* public String getProperty(String key)
* public Set stringPropertyNames()
案例:使用它的特有功能添加元素並遍歷
package com.edu_08;
import java.util.Properties;
import java.util.Set;
public class PropertiesDemo2 {
public static void main(String[] args) {
Properties prop = new Properties();
prop.setProperty("huangxiaoming", "baby");
prop.setProperty("dengchao", "sunli");
prop.setProperty("xidada", "pengliyuan");
Set<String> keys = prop.stringPropertyNames();
for (String key : keys) {
System.out.println(key+":"+prop.getProperty(key));
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
9.3
* 可以和IO流進行結合使用:
* 把文件中的數據加載到集合中。注意:文件中的數據必須是鍵值對象形式的(例如:String1=String2)
* public void load(InputStream inStream)
* public void load(Reader reader)
案例:創建一個鍵值對文件,將文件中的鍵值對加載到集合中,輸出集合
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
public class PropertiesDemo3 {
public static void main(String[] args) throws IOException {
Properties prop = new Properties();
prop.load(new FileReader("prop.txt"));
Set<String> keys = prop.stringPropertyNames();
for (String key : keys) {
System.out.println(key+":"+prop.getProperty(key));
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 把集合中的數據存儲到文本文件中,並且是按照鍵值對形式存儲的。
- public void store(OutputStream out,String comments)
- public void store(Writer writer,String comments)
案例:將創建的鍵值對集合加載到文件中
package com.edu_08;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class PropertiesDemo4 {
public static void main(String[] args) throws IOException {
Properties prop = new Properties();
prop.setProperty("liudehua", "50");
prop.setProperty("liming", "60");
prop.setProperty("zhangxueyou", "40");
prop.store(new FileWriter("prop2.txt"), "name=age");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
案例:我有一個文本文件,我知道數據是鍵值對形式的,但是不知道內容是什麼。 請寫一個程序判斷是否有“lisi”這樣的鍵存在,如果有就改變其值爲”100”
分析:1.我們可以先將文本加載到集合中,然後獲取所有的鍵的集合
2.在判斷集合中是否有這樣的鍵,如果有的話,重新給集合中添加這樣的鍵值對,
3.最後將修改後的集合,寫入到文本中
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
public class PropTest {
public static void main(String[] args) throws IOException {
/**
* zhangsan=3
lisi=4
wangwu=5
1.創建集合對象
2.將文件中的鍵值對加載到集合中
3.獲取多有的鍵的集合,遍歷,判斷
4.如果存在lisi,的話,給集合中重新存儲鍵值對lisi=100
5.將集合中的數據存儲到文件中
*/
Properties prop = new Properties();
prop.load(new FileReader("prop3.txt"));
Set<String> keys = prop.stringPropertyNames();
for (String key : keys) {
if ("lisi".equals(key)) {
prop.setProperty(key, "100");
}
}
prop.store(new FileWriter("prop3.txt"), null);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
案例:我有一個猜數字小遊戲的程序,請寫一個程 序實現在測試類中只能用分 超過5次提示:遊戲試玩已結束,請付費。 態
態`這裏寫代碼片態析:
1.先創建一個運行遊戲的類,注意一定是靜態的,因爲只有靜態才 能調用靜態
2.創建一個文本,裏面存入count=1,然後將文本加載到集合中,
3.然後將取出的文本,獲取count對應的次數,
4. 判斷,如果次數大於0,就開始執行遊戲,每運行一次後,次數加一,然後添加到集合中,
5,將集合中數據,加載到文本中
1.創建遊戲類,
import java.util.Scanner;
public class GuessNumber {
public static void startGame(){
int ran = (int) (Math.random()*100+1);
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("請輸入你猜測得數字");
int number = sc.nextInt();
if (number>ran) {
System.out.println("大了");
}else if (number<ran) {
System.out.println("小了");
}else if (number==ran) {
System.out.println("猜對了");
break;
}
}
}
}
2.創建測試類
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class PropTest {
public static void main(String[] args) throws IOException {
Properties prop = new Properties();
prop.load(new FileReader("count.txt"));
String count = prop.getProperty("count");
int number = Integer.parseInt(count);
if (number>4) {
System.out.println("次數已到,請付費");
}else {
GuessNumber.startGame();
number++;
prop.setProperty("count", number+"");
prop.store(new FileWriter("count.txt"), null);
}
}
}