آموزش جاوا - فایل ها
جریان
یک جریان را می توان به عنوان دنباله ای از داده ها تعریف کرد. دو نوع جریان وجود دارد -
-
InPutStream - InputStream برای خواندن داده ها از یک منبع استفاده می شود.
-
OutPutStream - OutputStream برای نوشتن داده ها در یک مقصد استفاده می شود.
جاوا پشتیبانی قوی اما انعطاف پذیری را برای I/O مربوط به فایل ها و شبکه ها ارائه می دهد، اما این آموزش عملکردهای بسیار ابتدایی مربوط به جریان ها و I/O را پوشش می دهد. متداول ترین نمونه های مورد استفاده را یکی یکی خواهیم دید
بایت استریم
جریان بایت جاوا برای انجام ورودی و خروجی بایت های 8 بیتی استفاده می شود. اگرچه کلاسهای زیادی مربوط به جریانهای بایتی وجود دارد، اما کلاسهای پرکاربرد FileInputStream و FileOutputStream هستند. در زیر مثالی وجود دارد که از این دو کلاس برای کپی کردن یک فایل ورودی در یک فایل خروجی استفاده میکند
مثال
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
حالا بیایید یک فایل input.txt با محتوای زیر داشته باشیم -
This is test for copy file.
در مرحله بعد برنامه فوق را کامپایل کرده و اجرا کنید که نتیجه آن ایجاد فایل output.txt با همان محتوایی است که در input.txt داریم. پس بیایید کد بالا را در فایل CopyFile.java قرار داده و موارد زیر را انجام دهیم
$javac CopyFile.java
$java CopyFile
جریان کارکتر
جریان های جاوا بایت برای انجام ورودی و خروجی بایت های 8 بیتی استفاده می شوند، در حالی که جریان های کاراکتر جاوا برای انجام ورودی و خروجی برای یونیکد 16 بیتی استفاده می شوند. اگرچه کلاسهای زیادی مربوط به جریان کاراکترها وجود دارد، اما کلاسهای پرکاربرد FileReader و FileWriter هستند. اگرچه در داخل FileReader از FileInputStream استفاده می کند و FileWriter از FileOutputStream استفاده می کند، اما در اینجا تفاوت عمده این است که FileReader در یک زمان دو بایت می خواند و FileWriter در یک زمان دو بایت می نویسد.
میتوانیم مثال بالا را دوباره بنویسیم، که از این دو کلاس برای کپی کردن یک فایل ورودی (دارای کاراکترهای یونیکد) در یک فایل خروجی استفاده میکند
مثال.
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
حالا بیایید یک فایل input.txt با محتوای زیر داشته باشیم -
This is test for copy file.
در مرحله بعد برنامه فوق را کامپایل کرده و اجرا کنید که نتیجه آن ایجاد فایل output.txt با همان محتوایی است که در input.txt داریم. پس بیایید کد بالا را در فایل CopyFile.java قرار داده و موارد زیر را انجام دهیم
$javac CopyFile.java
$java CopyFile
جریان های استاندارد
همه زبانهای برنامهنویسی از ورودی/خروجی استاندارد پشتیبانی میکنند که در آن برنامه کاربر میتواند ورودی را از صفحهکلید دریافت کند و سپس یک خروجی را روی صفحه کامپیوتر تولید کند. اگر از زبان های برنامه نویسی C یا C++ آگاه هستید، پس باید از سه دستگاه استاندارد STDIN، STDOUT و STDERR آگاه باشید. به طور مشابه، جاوا سه جریان استاندارد زیر را ارائه می دهد -
-
ورودی استاندارد - برای تغذیه داده ها به برنامه کاربر استفاده می شود و معمولاً یک صفحه کلید به عنوان جریان ورودی استاندارد استفاده می شود و به عنوان System.in نشان داده می شود .
-
خروجی استاندارد - برای خروجی داده های تولید شده توسط برنامه کاربر استفاده می شود و معمولاً از صفحه رایانه برای جریان خروجی استاندارد استفاده می شود و به عنوان System.out نشان داده می شود .
-
خطای استاندارد - برای خروجی داده های خطا تولید شده توسط برنامه کاربر استفاده می شود و معمولاً از صفحه رایانه برای جریان خطای استاندارد استفاده می شود و به عنوان System.err نشان داده می شود .
در زیر یک برنامه ساده وجود دارد که InputStreamReader را برای خواندن جریان ورودی استاندارد تا زمانی که کاربر یک "q" را تایپ کند ایجاد می کند.
مثال
import java.io.*;
public class ReadConsole {
public static void main(String args[]) throws IOException {
InputStreamReader cin = null;
try {
cin = new InputStreamReader(System.in);
System.out.println("Enter characters, 'q' to quit.");
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while(c != 'q');
}finally {
if (cin != null) {
cin.close();
}
}
}
}
بیایید کد بالا را در فایل ReadConsole.java نگه داریم و سعی کنیم مانند برنامه زیر آن را کامپایل و اجرا کنیم. این برنامه به خواندن و خروجی همان کاراکتر ادامه می دهد تا زمانی که 'q' − را فشار دهیم
$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q
خواندن و نوشتن فایل ها
همانطور که قبلا توضیح داده شد، یک جریان را می توان به عنوان دنباله ای از داده ها تعریف کرد. InputStream برای خواندن داده ها از یک منبع و OutputStream برای نوشتن داده ها به مقصد استفاده می شود.
در اینجا سلسله مراتبی از کلاس ها برای مقابله با جریان های ورودی و خروجی وجود دارد.
دو جریان مهم FileInputStream و FileOutputStream هستند که در این آموزش مورد بحث قرار خواهند گرفت.
FileInputStream
این جریان برای خواندن داده ها از فایل ها استفاده می شود. اشیاء را می توان با استفاده از کلمه کلیدی new ایجاد کرد و انواع مختلفی از سازنده موجود است.
سازنده زیر یک نام فایل را به عنوان رشته می گیرد تا یک شی جریان ورودی برای خواندن فایل ایجاد کند
InputStream f = new FileInputStream("C:/java/hello");
سازنده زیر یک شی فایل را برای ایجاد یک شی جریان ورودی برای خواندن فایل می گیرد. ابتدا یک شی فایل با استفاده از متد File() به صورت زیر ایجاد می کنیم
File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);
هنگامی که آبجکت InputStream را در دست دارید، لیستی از روشهای کمکی وجود دارد که میتوان از آنها برای خواندن به جریان یا انجام سایر عملیات در جریان استفاده کرد.
روش و توضیحات | |
---|---|
1 |
public void close() IOException را پرتاب می کند{} این روش جریان خروجی فایل را می بندد. منابع سیستمی مرتبط با فایل را آزاد می کند. یک IOException را پرتاب می کند. |
2 |
محافظت شده void finalize() IOException {} این روش اتصال به فایل را پاک می کند. اطمینان حاصل می کند که روش بستن این جریان خروجی فایل زمانی فراخوانی می شود که دیگر ارجاعی به این جریان وجود ندارد. یک IOException را پرتاب می کند. |
3 |
عمومی int read(int r) IOException را پرتاب می کند{} این روش بایت مشخص شده داده را از InputStream می خواند. یک int را برمی گرداند. بایت بعدی داده را برمی گرداند و اگر انتهای فایل باشد -1 برمی گردد. |
4 |
عمومی int read(byte[] r) IOException را پرتاب می کند{} این روش بایت های r.length را از جریان ورودی به یک آرایه می خواند. تعداد کل بایت های خوانده شده را برمی گرداند. اگر انتهای فایل باشد -1 برگردانده می شود. |
5 |
public int available() IOException را پرتاب می کند{} تعداد بایت هایی را می دهد که می توان از این جریان ورودی فایل خواند. یک int را برمی گرداند |
جریانهای ورودی مهم دیگری نیز در دسترس هستند، برای جزئیات بیشتر می توانید به پیوندهای زیر مراجعه کنید -
-
ByteArrayInputStream
-
DataInputStream
FileOutputStream
FileOutputStream برای ایجاد یک فایل و نوشتن داده در آن استفاده می شود. جریان قبل از باز کردن فایل برای خروجی، در صورتی که از قبل وجود نداشته باشد، میسازد.
در اینجا دو سازنده وجود دارد که می توان از آنها برای ایجاد یک شی FileOutputStream استفاده کرد.
سازنده زیر یک نام فایل را به عنوان رشته می گیرد تا یک شی جریان ورودی برای نوشتن فایل - ایجاد کن
OutputStream f = new FileOutputStream("C:/java/hello")
سازنده زیر یک شی فایل را برای ایجاد یک شی جریان خروجی برای نوشتن فایل می گیرد. ابتدا یک شی فایل با استفاده از روش File() به صورت زیر ایجاد می کنیم
File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
هنگامی که شی OutputStream را در دست دارید، لیستی از روش های کمکی وجود دارد که می توان از آنها برای نوشتن در جریان یا انجام سایر عملیات روی جریان استفاده کرد.
Sr.No. | روش و توضیحات |
---|---|
1 |
public void close() IOException را پرتاب می کند{} این روش جریان خروجی فایل را می بندد. منابع سیستمی مرتبط با فایل را آزاد می کند. یک IOException را پرتاب می کند. |
2 |
محافظت شده void finalize() IOException {} این روش اتصال به فایل را پاک می کند. اطمینان حاصل می کند که روش بستن این جریان خروجی فایل زمانی فراخوانی می شود که دیگر ارجاعی به این جریان وجود ندارد. یک IOException را پرتاب می کند. |
3 |
public void write(int w) IOException را پرتاب می کند{} این روش بایت مشخص شده را در جریان خروجی می نویسد. |
4 |
نوشتن خالی عمومی (بایت[] w) بایت های w.length را از آرایه بایت ذکر شده در OutputStream می نویسد. |
جریان های خروجی مهم دیگری در دسترس هستند، برای جزئیات بیشتر می توانید به پیوندهای زیر مراجعه کنید -
-
ByteArrayOutputStream
-
DataOutputStream
FileOutputStream
FileOutputStream برای ایجاد یک فایل و نوشتن داده در آن استفاده می شود. جریان قبل از باز کردن فایل برای خروجی، در صورتی که از قبل وجود نداشته باشد، میسازد.
در اینجا دو سازنده وجود دارد که می توان از آنها برای ایجاد یک شی FileOutputStream استفاده کرد.
سازنده زیر یک نام فایل را به عنوان رشته می گیرد تا یک شی جریان ورودی برای نوشتن فایل - ایجاد کند
OutputStream f = new FileOutputStream("C:/java/hello")
سازنده زیر یک شی فایل را برای ایجاد یک شی جریان خروجی برای نوشتن فایل می گیرد. ابتدا یک شی فایل با استفاده از روش File() به صورت زیر ایجاد می کنیم
File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
هنگامی که شی OutputStream را در دست دارید، لیستی از روش های کمکی وجود دارد که می توان از آنها برای نوشتن در جریان یا انجام سایر عملیات روی جریان استفاده کرد.
Sr.No. | روش و توضیحات |
---|---|
1 |
public void close() IOException را پرتاب می کند{} این روش جریان خروجی فایل را می بندد. منابع سیستمی مرتبط با فایل را آزاد می کند. یک IOException را پرتاب می کند. |
2 |
محافظت شده void finalize() IOException {} این روش اتصال به فایل را پاک می کند. اطمینان حاصل می کند که روش بستن این جریان خروجی فایل زمانی فراخوانی می شود که دیگر ارجاعی به این جریان وجود ندارد. یک IOException را پرتاب می کند. |
3 |
public void write(int w) IOException را پرتاب می کند{} این روش بایت مشخص شده را در جریان خروجی می نویسد. |
4 |
نوشتن خالی عمومی (بایت[] w) بایت های w.length را از آرایه بایت ذکر شده در OutputStream می نویسد. |
جریان های خروجی مهم دیگری در دسترس هستند، برای جزئیات بیشتر می توانید به پیوندهای زیر مراجعه کنید -
-
ByteArrayOutputStream
-
DataOutputStream
مثال
در زیر مثالی برای نشان دادن InputStream و OutputStream آمده است
import java.io.*;
public class fileStreamTest {
public static void main(String args[]) {
try {
byte bWrite [] = {11,21,3,40,5};
OutputStream os = new FileOutputStream("test.txt");
for(int x = 0; x < bWrite.length ; x++) {
os.write( bWrite[x] ); // writes the bytes
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();
for(int i = 0; i < size; i++) {
System.out.print((char)is.read() + " ");
}
is.close();
} catch (IOException e) {
System.out.print("Exception");
}
}
}
کد بالا فایل test.txt را ایجاد می کند و اعداد داده شده را در قالب باینری می نویسد. همان خروجی در صفحه stdout خواهد بود.
مسیریابی فایل و I/O
چندین کلاس دیگر نیز وجود دارد که برای آشنایی با مبانی File Navigation و I/O میگذریم.
-
کلاس فایل
-
کلاس FileReader
-
کلاس FileWriter
دایرکتوری ها در جاوا
دایرکتوری فایلی است که می تواند حاوی لیستی از فایل ها و دایرکتوری های دیگر باشد. شما از File object برای ایجاد دایرکتوری ها، برای فهرست کردن فایل های موجود در یک دایرکتوری استفاده می کنید. برای جزئیات کامل، فهرستی از تمام روشهایی را که میتوانید روی شی File فراخوانی کنید و آنچه به فهرستها مربوط میشود، بررسی کنید.
ایجاد دایرکتوری ها
دو روش مفید File utility وجود دارد که می توان از آنها برای ایجاد دایرکتوری ها استفاده کرد
-
متد mkdir( ) یک دایرکتوری ایجاد می کند که در صورت موفقیت true و در صورت شکست false را برمی گرداند. Failure نشان می دهد که مسیر مشخص شده در شی File از قبل وجود دارد یا اینکه دایرکتوری نمی تواند ایجاد شود زیرا کل مسیر هنوز وجود ندارد.
-
متد mkdirs () هم یک دایرکتوری و هم تمام والدین دایرکتوری را ایجاد می کند.
مثال زیر دایرکتوری "/tmp/user/java/bin" را ایجاد می کند -
مثال
import java.io.File;
public class CreateDir {
public static void main(String args[]) {
String dirname = "/tmp/user/java/bin";
File d = new File(dirname);
// Create directory now.
d.mkdirs();
}
}
برای ایجاد "/tmp/user/java/bin" کد بالا را کامپایل و اجرا کنید.
توجه - جاوا به طور خودکار از جداکننده های مسیر در یونیکس و ویندوز طبق قرارداد مراقبت می کند. اگر از اسلش رو به جلو (/) در نسخه ویندوز جاوا استفاده کنید، مسیر همچنان به درستی حل خواهد شد.
فهرست راهنماها
میتوانید از متد list() ارائهشده توسط File برای فهرست کردن همه فایلها و دایرکتوریهای موجود در یک فهرست به صورت زیر استفاده کنید.
مثال
import java.io.File;
public class ReadDir {
public static void main(String[] args) {
File file = null;
String[] paths;
try {
// create new file object
file = new File("/tmp");
// array of files and directory
paths = file.list();
// for each name in the path array
for(String path:paths) {
// prints filename and directory name
System.out.println(path);
}
} catch (Exception e) {
// if any error occurs
e.printStackTrace();
}
}
}
این نتیجه زیر را بر اساس دایرکتوری ها و فایل های موجود در دایرکتوری /tmp شما ایجاد می کند
خروجی
test1.txt
test2.txt
ReadDir.java
ReadDir.class