0バイトストリームとバイナリファイル
私のコード
package javalearning;
import java.io.*;
import java.util.*;
class Student {
private int id;
private String name;
private int age;
private double grade;
public Student(){
}
public Student(int id, String name, int age, double grade) {
this.id = id;
this.setName(name);
this.setAge(age);
this.setGrade(grade);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
if (name.length()>10){
throw new IllegalArgumentException("name's length should <=10 "+name.length());
}
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age<=0){
throw new IllegalArgumentException("age should >0 "+age);
}
this.age = age;
}
public double getGrade() {
return grade;
}
public void setGrade(double grade) {
if (grade<0 || grade >100){
throw new IllegalArgumentException("grade should be in [0,100] "+grade);
}
this.grade = grade;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", grade=" + grade + "]";
}
}
public class Main {
public static void main(String[] args)
{
String fileName="d:\\testStream\\0\\student.data";
try(DataOutputStream dos=new DataOutputStream(new FileOutputStream(fileName)))
{
Student stu1=new Student(1,"zhang",13,80);
dos.writeInt(stu1.getId());
dos.writeUTF(stu1.getName());
dos.writeInt(stu1.getAge());
dos.writeDouble(stu1.getGrade());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try(DataInputStream dis=new DataInputStream(new FileInputStream(fileName)))
{
int id=dis.readInt();
String name=dis.readUTF();
int age=dis.readInt();
double grade=dis.readDouble();
Student stu=new Student(id,name,age,grade);
System.out.println(stu);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
私の概要
A、バイナリファイルを書き込むDataOutputStreamのとのFileOutputStreamを使用して、学生オブジェクトstudent.data
- バイナリとテキストファイルの違い
- バイナリファイルがint /ダブル/炭..基本データ型を保存することができる、テキストファイルには、char型を格納することができます。このように、テキストファイルまたはストアドプロシージャを読むことが多い(のparseIntに類似)のキャストを使用する必要があります
2.try ...キャッチ...最後に注意事項
- 異常な書き込みの注目順に複数の例外をキャッチし、一般的には珍しい、(親)拡大は、より戻すために。日食は直接便利な、自分自身の異常発生と間違って行くことはない直接のプロンプトを使用することができます。
3.使用try..with ... resoucesは、リソースを閉じます
- jdk8新しい構文は、あなたが最後に直接試してみる(........)括弧で閉じられたリソースであることを定義することができ、自動実行の終了後にシャットダウンします、あなたのない最終的には伝統的なリソースをシャットダウンする必要があります。使用コードブロックの上を参照してください。
文字とテキストファイルの1ストリーム
私のコード
作業1
String fileName="d:\\testStream\\1\\Students.txt";
List<Student> studentList = new ArrayList<>();
try(
FileInputStream fis=new FileInputStream(fileName);
InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
BufferedReader br=new BufferedReader(isr))
{
String line=null;
while((line=br.readLine())!=null)
{
String[] msg=line.split("\\s+");
int id=Integer.parseInt(msg[0]);
String name=msg[1];
int age=Integer.parseInt(msg[2]);
double grade=Double.parseDouble(msg[3]);
Student stu=new Student(id,name,age,grade);
studentList.add(stu);
}
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(studentList);
タスク2
public static List<Student> readStudents(String fileName)
{
List<Student> studentList = new ArrayList<>();
try(
FileInputStream fis=new FileInputStream(fileName);
InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
BufferedReader br=new BufferedReader(isr))
{
String line=null;
while((line=br.readLine())!=null)
{
String[] msg=line.split("\\s+");
int id=Integer.parseInt(msg[0]);
String name=msg[1];
int age=Integer.parseInt(msg[2]);
double grade=Double.parseDouble(msg[3]);
Student stu=new Student(id,name,age,grade);
studentList.add(stu);
}
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return studentList;
}
タスク3
String fileName="d:\\testStream\\1\\Students.txt";
try(
FileOutputStream fos=new FileOutputStream(fileName,true);
OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
PrintWriter pw=new PrintWriter(osw))
{
pw.println();
pw.print("4 一一 13 80");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
タスク4
String fileName1="d:\\testStream\\1\\Students.dat";
try(
FileOutputStream fos=new FileOutputStream(fileName1);
ObjectOutputStream oos=new ObjectOutputStream(fos))
{
Student ts=new Student(5,"asd",14,60);
oos.writeObject(ts);
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try(
FileInputStream fis=new FileInputStream(fileName1);
ObjectInputStream ois=new ObjectInputStream(fis))
{
Student newStudent =(Student)ois.readObject();
System.out.println(newStudent);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
私の概要
- タスク2、図3において、プログラムは、TXTファイルは、UTF-8エンコーディングを指定する生成します。それ以降は、人為的にシステムを介して開いた場合Students.txtが来て、テキスト文書保存、テキストはUTF-8 BOMがエンコードになります。指定されたファイルが実際にUTF-8 UTF-8 BOMであるため、エラーが同じではありません、もう一度プログラムを実行しますので、この問題は、今いくつかの時間のために私を悩また私の解決策は、2倍である:だれしない保存人々は保存する必要があり、または使用のメモ帳++。
- 真のFileOutputStreamを構築するときに、タスク3スタートのPrintWriterが直接情報へのアクセスを通じて、元のファイルを上書きし、それをマルチパス。
- タスク4は、スタートがTXTで書かれたオブジェクトの流れを作ることで、ゴミは後に見つかっ起こります。情報へのアクセスを通じてのwriteObject()役割を知っているので、ファイル形式を処理するオブジェクトストリームが右側に、バットで聞かせて、ディスクに保存されたファイルの形で例を作ることであり、このファイルはバイナリ形式で書かれています。
2.バッファされたストリーム
私のコード
package javalearning;
import java.io.*;
import java.util.*;
public class Main2 {
public static void main(String[] args) {
String fileName="d:\\testStream\\2\\test.txt";
try (PrintWriter pw = new PrintWriter(fileName);)
{
Random random=new Random();
random.setSeed(100);
double sum=0,aver;
for (int i = 0; i < 1000_0000; i++) {
int r=random.nextInt(10);
sum+=r;
pw.println(r);
}
aver=sum/1000_0000;
System.out.format("%.5f", aver);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
JUnitテストセクション
package javalearning;
import static org.junit.jupiter.api.Assertions.*;
import java.io.*;
import java.util.*;
import org.junit.jupiter.api.Test;
class testBufferedReader {
String fileName="d:\\testStream\\2\\test.txt";
@Test
void testScanner() {
try ( FileInputStream fis = new FileInputStream(fileName);
Scanner sc=new Scanner(fis))
{
while(sc.hasNextInt())
{
sc.nextInt();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally
{
System.out.println("sc end");
}
}
@Test
void testBufferedReader() {
try ( FileReader fr = new FileReader(fileName);
BufferedReader br=new BufferedReader(fr))
{
String line=null;
while((line=br.readLine())!=null)
{
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally
{
System.out.println("br end");
}
}
}
私の概要
- 乱数を生成すると、通常は必要なときに、それぞれが最初に検索情報を持っていた、あまり使用して、一般的な使用法を覚えてみてください。
- 乱数がファイルに書き込まれた場合、代わりのprintlnの印刷を使用している場合、文字サイズがキャリッジリターンを書いていない、(1000_0000 3000_0000バイトとバイト)が、理由が理解できないというのprintlnの第三になり、その後、結果のJUnitを使い果たしましたスキャナとBufferedReaderの時間はほぼ同じであり、時間のギャップは非常に大きい入力書きました。
- JUNIT前者の方法は@Testを追加するためにテストします