มีคนอธิบายให้ฉันเป็นอะไรInputStream
และOutputStream
เป็นอย่างไร
ฉันกำลังสับสนเกี่ยวกับกรณีการใช้งานสำหรับทั้งสองและInputStream
OutputStream
หากคุณสามารถใส่ตัวอย่างของรหัสเพื่อไปพร้อมกับคำอธิบายของคุณนั่นจะเป็นสิ่งที่ยอดเยี่ยม ขอบคุณ!
มีคนอธิบายให้ฉันเป็นอะไรInputStream
และOutputStream
เป็นอย่างไร
ฉันกำลังสับสนเกี่ยวกับกรณีการใช้งานสำหรับทั้งสองและInputStream
OutputStream
หากคุณสามารถใส่ตัวอย่างของรหัสเพื่อไปพร้อมกับคำอธิบายของคุณนั่นจะเป็นสิ่งที่ยอดเยี่ยม ขอบคุณ!
คำตอบ:
เป้าหมายของInputStream
และOutputStream
เพื่อสรุปวิธีการอินพุตและเอาต์พุตที่เป็นนามธรรม: ไม่ว่าสตรีมจะเป็นไฟล์หน้าเว็บหรือหน้าจอไม่ควรสำคัญ สิ่งที่สำคัญคือคุณได้รับข้อมูลจากสตรีม (หรือส่งข้อมูลไปยังสตรีมนั้น)
InputStream
ใช้สำหรับหลายสิ่งที่คุณอ่าน
OutputStream
ใช้สำหรับหลายสิ่งที่คุณเขียนถึง
นี่คือตัวอย่างรหัส มันถือว่าInputStream instr
และOutputStream osstr
ได้ถูกสร้างขึ้นแล้ว:
int i;
while ((i = instr.read()) != -1) {
osstr.write(i);
}
instr.close();
osstr.close();
InputStream ใช้สำหรับการอ่าน, OutputStream สำหรับการเขียน พวกมันเชื่อมต่อกันเป็นมัณฑนากรซึ่งกันและกันซึ่งคุณสามารถอ่าน / เขียนข้อมูลประเภทต่าง ๆ ทั้งหมดจากแหล่งข้อมูลประเภทต่าง ๆ ทั้งหมด
ตัวอย่างเช่นคุณสามารถเขียนข้อมูลดั้งเดิมไปยังไฟล์:
File file = new File("C:/text.bin");
file.createNewFile();
DataOutputStream stream = new DataOutputStream(new FileOutputStream(file));
stream.writeBoolean(true);
stream.writeInt(1234);
stream.close();
หากต้องการอ่านเนื้อหาที่เขียน:
File file = new File("C:/text.bin");
DataInputStream stream = new DataInputStream(new FileInputStream(file));
boolean isTrue = stream.readBoolean();
int value = stream.readInt();
stream.close();
System.out.printlin(isTrue + " " + value);
คุณสามารถใช้สตรีมประเภทอื่นเพื่อปรับปรุงการอ่าน / เขียน ตัวอย่างเช่นคุณสามารถแนะนำบัฟเฟอร์เพื่อประสิทธิภาพ:
DataInputStream stream = new DataInputStream(
new BufferedInputStream(new FileInputStream(file)));
คุณสามารถเขียนข้อมูลอื่น ๆ เช่นวัตถุ:
MyClass myObject = new MyClass(); // MyClass have to implement Serializable
ObjectOutputStream stream = new ObjectOutputStream(
new FileOutputStream("C:/text.obj"));
stream.writeObject(myObject);
stream.close();
คุณสามารถอ่านจากแหล่งอินพุตอื่น:
byte[] test = new byte[] {0, 0, 1, 0, 0, 0, 1, 1, 8, 9};
DataInputStream stream = new DataInputStream(new ByteArrayInputStream(test));
int value0 = stream.readInt();
int value1 = stream.readInt();
byte value2 = stream.readByte();
byte value3 = stream.readByte();
stream.close();
System.out.println(value0 + " " + value1 + " " + value2 + " " + value3);
สำหรับอินพุตสตรีมส่วนใหญ่จะมีสตรีมเอาต์พุตเช่นกัน คุณสามารถกำหนดสตรีมของคุณเองเพื่ออ่าน / เขียนสิ่งพิเศษและมีสตรีมที่ซับซ้อนสำหรับการอ่านสิ่งที่ซับซ้อน (เช่นมีสตรีมสำหรับการอ่าน / เขียนรูปแบบ ZIP)
จากการสอน Java :
กระแสข้อมูลเป็นลำดับของข้อมูล
โปรแกรมใช้สตรีมอินพุตเพื่ออ่านข้อมูลจากแหล่งหนึ่งรายการต่อครั้ง:
โปรแกรมใช้เอาต์พุตสตรีมเพื่อเขียนข้อมูลไปยังปลายทางหนึ่งไอเท็มต่อครั้ง:
แหล่งข้อมูลและปลายทางข้อมูลภาพด้านบนสามารถเป็นสิ่งที่เก็บสร้างหรือใช้ข้อมูล เห็นได้ชัดว่านี้รวมถึงไฟล์ดิสก์แต่ต้นทางหรือปลายทางยังสามารถเป็นโปรแกรมอื่นอุปกรณ์ต่อพ่วง, ซ็อกเก็ตเครือข่ายหรืออาร์เรย์
โค้ดตัวอย่างจาก oracle tutorial:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyBytes {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
นี้ใช้โปรแกรมไบต์ลำธารเพื่อคัดลอกxanadu.txtไฟล์outagain.txt , โดยการเขียนหนึ่งไบต์ในเวลา
ดูคำถาม SE นี้เพื่อทราบรายละเอียดเพิ่มเติมเกี่ยวกับตัวละครขั้นสูงซึ่งเป็นบทสรุปของ Byte Streams:
คุณอ่านจาก InputStream และเขียนไปยัง OutputStream
ตัวอย่างเช่นสมมติว่าคุณต้องการคัดลอกไฟล์ คุณจะสร้าง FileInputStream เพื่ออ่านจากไฟล์ต้นฉบับและ FileOutputStream เพื่อเขียนไปยังไฟล์ใหม่
หากข้อมูลของคุณเป็นตัวละครสตรีมคุณสามารถใช้ FileReader แทน InputStream และ FileWriter แทนที่จะเป็น OutputStream หากคุณต้องการ
InputStream input = ... // many different types
OutputStream output = ... // many different types
byte[] buffer = new byte[1024];
int n = 0;
while ((n = input.read(buffer)) != -1)
output.write(buffer, 0, n);
input.close();
output.close();
close
flush
es เสมอดังนั้นไม่
OutputStream เป็นคลาสนามธรรมที่แสดงถึงการเขียนออก มีคลาส OutputStream ที่แตกต่างกันมากมายและพวกเขาเขียนออกไปยังบางสิ่ง (เช่นหน้าจอหรือไฟล์หรืออาร์เรย์ไบต์หรือการเชื่อมต่อเครือข่ายหรืออื่น ๆ ) ชั้นเรียน InputStream เข้าถึงสิ่งเดียวกัน แต่พวกเขาอ่านข้อมูลจากพวกเขา
นี่เป็นตัวอย่างพื้นฐานที่ดีในการใช้ FileOutputStream และ FileInputStream เพื่อเขียนข้อมูลลงในไฟล์จากนั้นอ่านกลับมาใหม่
กระแสคือการไหลของของเหลวอากาศหรือก๊าซอย่างต่อเนื่อง
กระแส Java คือการไหลของข้อมูลจากแหล่งที่มาสู่ปลายทาง ต้นทางหรือปลายทางสามารถเป็นดิสก์หน่วยความจำซ็อกเก็ตหรือโปรแกรมอื่น ๆ ข้อมูลสามารถเป็นไบต์อักขระหรือวัตถุ เช่นเดียวกับสตรีม C # หรือ C ++ อุปมาที่ดีสำหรับสายน้ำจาวาคือน้ำที่ไหลจากก๊อกลงในอ่างอาบน้ำ
ข้อมูลแสดงถึงส่วนที่คงที่ของกระแส วิธีการอ่านและเขียนส่วนไดนามิกของกระแส
InputStream
หมายถึงการไหลของข้อมูลจากแหล่งที่มาการOutputStream
ไหลของข้อมูลลงในปลายทาง ในที่สุดInputStream
และOutputStream
เป็น abstractions ผ่านการเข้าถึงข้อมูลในระดับต่ำเช่นตัวชี้ไฟล์ C
สตรีม : ในสตรีมศัพท์เทอมคือข้อมูลสตรีมทั่วไปส่วนใหญ่เป็นการแสดงข้อมูลแบบไบนารี
อินพุตสตรีม : หากคุณกำลังอ่านข้อมูลจากไฟล์หรือแหล่งอื่น ๆ สตรีมที่ใช้คือสตรีมอินพุต ในเงื่อนไขการป้อนข้อมูลง่ายขึ้นทำหน้าที่เป็นช่องทางในการอ่านข้อมูล
สตรีมเอาท์พุท : หากคุณต้องการอ่านและประมวลผลข้อมูลจากแหล่ง (ไฟล์ ฯลฯ ) ก่อนอื่นคุณต้องบันทึกข้อมูลค่าเฉลี่ยในการจัดเก็บข้อมูลคือเอาต์พุตสตรีม
โดยทั่วไปสตรีมเอาท์พุตจะเกี่ยวข้องกับปลายทางข้อมูลบางอย่างเช่นไฟล์หรือเครือข่ายเป็นต้นในสตรีมเอาท์พุท Java เป็นปลายทางที่ข้อมูลถูกเขียนในที่สุดและสิ้นสุด
import java.io.printstream;
class PPrint {
static PPrintStream oout = new PPrintStream();
}
class PPrintStream {
void print(String str) {
System.out.println(str)
}
}
class outputstreamDemo {
public static void main(String args[]) {
System.out.println("hello world");
System.out.prinln("this is output stream demo");
}
}