สร้างอ็อบเจ็กต์ File ในหน่วยความจำจากสตริงใน Java


113

ฉันมีฟังก์ชันที่ยอมรับไฟล์เป็นอาร์กิวเมนต์ ฉันไม่ต้องการสร้าง / เขียนไฟล์ใหม่ (ฉันไม่มีสิทธิ์เขียนระบบไฟล์) เพื่อที่จะส่งข้อมูลสตริงของฉันไปยังฟังก์ชัน ฉันควรเพิ่มว่าข้อมูล String ไม่มีอยู่ในไฟล์ (ดังนั้นฉันจึงไม่สามารถอ่านข้อมูลของฉันจากไฟล์ได้)

ฉันสามารถใช้สตรีมและ "ส่ง" ไปยังออบเจ็กต์ไฟล์ได้หรือไม่


2
คุณสามารถเชื่อมโยง / โพสต์รหัสที่ใช้Fileวัตถุได้หรือไม่? ตามที่คำตอบได้ระบุไว้Fileวัตถุก็เหมือนกับการอ้างอิงตำแหน่งในระบบไฟล์ดังนั้นจึงยากที่จะจำลองโดยไม่มีไฟล์จริง อย่างไรก็ตามหากฟังก์ชันของคุณใช้ a FileReaderหรือ a FileInputStreamคุณสามารถแก้ไขโค้ดเพื่อยอมรับการป้อนข้อมูลที่ไม่ใช่ไฟล์ได้อย่างง่ายดาย
101100

คุณสามารถเลือกไฟล์ที่แมปหน่วยความจำได้ ไฟล์เหล่านี้เป็นไฟล์พิเศษใน Java ซึ่งอนุญาตให้โปรแกรม Java เข้าถึงเนื้อหาได้โดยตรงจากหน่วยความจำ ดูรายละเอียดผ่านลิงค์นี้: javarevisited.blogspot.com/2012/01/…
Bacteria

คำตอบ:


48

ไม่มี อินสแตนซ์ของคลาสFileแสดงเส้นทางในระบบไฟล์ ดังนั้นคุณสามารถใช้ฟังก์ชันนั้นกับไฟล์เท่านั้น แต่อาจมีการโอเวอร์โหลดที่ใช้InputStreamแทน?


77

โดยปกติเมื่อเมธอดยอมรับไฟล์จะมีวิธีอื่นในบริเวณใกล้เคียงที่รับสตรีม หากไม่เป็นเช่นนั้นแสดงว่า API มีรหัสไม่ถูกต้อง มิฉะนั้นคุณสามารถใช้ไฟล์ชั่วคราวได้ซึ่งโดยปกติจะได้รับอนุญาตในหลายกรณี ถ้าเป็นแอปเพล็คุณสามารถขอเขียนได้รับอนุญาต

ตัวอย่าง:

try {
    // Create temp file.
    File temp = File.createTempFile("pattern", ".suffix");

    // Delete temp file when program exits.
    temp.deleteOnExit();

    // Write to temp file
    BufferedWriter out = new BufferedWriter(new FileWriter(temp));
    out.write("aString");
    out.close();
} catch (IOException e) {
}

1
ไม่สามารถขออนุญาตเขียนได้ (คือ Google AppEngine)
Jon Romero

12

ไฟล์วัตถุใน Java เป็นตัวแทนของเส้นทางที่จะไดเรกทอรีหรือไฟล์ไม่ได้ไฟล์ตัวเอง คุณไม่จำเป็นต้องมีสิทธิ์ในการเขียนระบบไฟล์เพื่อสร้างFileออบเจ็กต์คุณจะต้องใช้มันก็ต่อเมื่อคุณตั้งใจจะเขียนลงไฟล์จริงๆ (โดยใช้FileOutputStreamเป็นต้น)


1
หากคุณต้องการส่งไฟล์ไปยัง API ภายนอกคุณต้องมีไฟล์จริงซึ่งการส่งผ่านอ็อบเจกต์ไฟล์ "ว่าง" จะไม่ทำงาน
Andrei Volgin

8

Fileชั้นหมายถึง "ความคิด" ของไฟล์ไม่จับจริงเพื่อการใช้งานสำหรับ I / O นี่คือเหตุผลที่Fileคลาสมี.exists()วิธีการเพื่อบอกคุณว่ามีไฟล์อยู่หรือไม่ (คุณมีFileวัตถุที่ไม่มีอยู่จริงได้อย่างไร?)

ในทางตรงกันข้ามการสร้าง a new FileInputStream(new File("/my/file"))จะช่วยให้คุณมีสตรีมที่อ่านไบต์ได้จริง


-1
FileReader r = new FileReader(file);

ใช้โปรแกรมอ่านไฟล์โหลดไฟล์จากนั้นเขียนเนื้อหาลงในบัฟเฟอร์สตริง

ตัวอย่าง

ลิงก์ด้านบนแสดงตัวอย่างวิธีการดำเนินการนี้ ดังที่โพสต์อื่น ๆ ของคำตอบนี้กล่าวว่าการโหลดไฟล์ลงในหน่วยความจำคุณไม่จำเป็นต้องมีสิทธิ์การเขียนตราบใดที่คุณไม่ได้วางแผนที่จะทำการเปลี่ยนแปลงไฟล์จริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.