View Full Version : مبتدی: کمک استادی بزرگوار __ مشکل در یک پروژه که محتوای یک URL بگیره و درون یک فایل htm ذخیره کنه!!!!
silverado1371
پنج شنبه 10 تیر 1395, 13:57 عصر
سلام اساتید گرامی. من درحال آموزش برنامه نویسی جاوا هستم. بعد آموزش کار با URL در حدی که بتونم Content یک URL رو تو خروجی چاپ کنم(سورس صفحه) آموزش دیدم و قبل این کارم ساخت فایل تکست و نوشتن متن تو این فایل رو هم یاد گرفتم !!! به هر حال من تصمیم گرفتم که با همین یخورده آموزشی که دیدم یک پروژه واسه خودم انجام بدم ! که پایین یه چیزی شبیه الگوریتمشو مینویسم:
__________________________________________________ __________________________________________________ _____________
1- اول کلاسی بنویسیم که مخصوص دستورات مربوط به فایل باشه!
الف- متدی بنویسیم که فایل index.htm رو بسازه
ب- متدی بنویسیم که آرگومانی که محتوای صفحه URL درونش هست رو بگیره و عملیات نوشتن محتویات صفحه را داخل فایلindex.html، انجام بده.
پ- یک متد هم برای خوندن فایل بنویسیم ! تا در خروجی محتوای فایل رو نشونمون بده.
2- دوم یک کلاس می نویسم که کارهای URL رو انجام بده یعنی
الف- URL رو بگیره >> حالا من خودم دستی تو کد واردش کردم!
ب- شروع به خوندن محتوای صفحه URL بکنه و اونو تو یه متد برگشت بده تا درون کلاسی که متد main داره پاسش بدیم به متد که قراره محتوای سایت رو درون فایل ذخیره کنه!
3- کلاسی بنویسیم شامل متد main برای اجرا برنامه
__________________________________________________ __________________________________________________ _____________
خواهش می کنم اساتید و دوستانی که کمک می کنند با توضیح این کار رو انجام بدن چون من تو برنامه نویسی مبتدی هستم !!!
فایل پروژه خودم که فقط تونستم تا اینجا انجامش بدم !! لطفا راهنمایی بفرمایید :خجالت:
vahid-p
پنج شنبه 10 تیر 1395, 23:29 عصر
برخی مشکلات:
از توابع استاتیک جایی که ممکنه لازم نباشه استفاده کردی. مثلا در کلاس urlContentCopier همه چیز استاتیکه. این باعث میشه اگر بخوای از دو یا چند URL همزمان بخونی، نمیتونی چون فقط در آن واحد یک addressUrl و inputStream و... خواهی داشت. در نتیجه کلاس urlContentCopier رو به این صورت تغییر میدم (هر چند اشتباه نیست). کدهای شما کامنت شده تا تفاوتش رو متوجه بشی (بخش های اضافه شده هم به کامنت شده Added statement یا Added a constructor) :
import java.io.InputStream;import java.net.HttpURLConnection;
import java.net.URL;
public class UrlContentCopier{//public class urlContentCopier {
private URL addressUrl;//private static URL addressUrl;
private HttpURLConnection siteConnection;//private static URLConnection siteConnection;
private int contentLength = 0;//private static int contentLength = 0;
private InputStream urlStream;//private static InputStream urlStream;
//Added a constructor
public UrlContentCopier(String url) {
setUrl(url);
}
private void setUrl(String url) {//public static void urlGetter() {
try {
addressUrl = new URL(url);//addressUrl = new URL("http://www.k-b.ir");
} catch (Exception ex) {
System.out.println(ex.toString());
}
}
public InputStream getContentStream() {//public static InputStream urlSetter() {
try {
siteConnection = (HttpURLConnection) addressUrl.openConnection(); //To Open Connection not send request
//You can add some parameters and headers
siteConnection.connect();//Added statment: To send parameters
if (siteConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {//Added statment: To check if http response status is OK(200)
contentLength = siteConnection.getContentLength();
if (contentLength != 0) {
urlStream = siteConnection.getInputStream();
} else {
System.out.println("Sorry! ther is no content!");
}
}
} catch (Exception ex) {
System.out.println(ex.toString());
}
return urlStream; //It is null, if response status is not OK(200) or respose has no body(for empty pages)
}
}
استاندارد اینه اسم کلاس با حرف بزرگ شروع بشه (البته اجباری نیست). اسم کلاس رو هم البته به نسبت خوب نوشتی اما اینجا عمل کپی انجام نمیشه پس مثلا بهتره بنویسی URLConnectionUtils به معنای ابزارهای لازم برای اتصال به URL (یا هر اسم دیگه ای دوست داشتی)
خب با توجه به این کلاس کد دو کلاس بعدیت رو ببین میتونی تغییر بدی؟ (سعی کن از هارد کد برای آدرس فایل استفاده نکنی یا هم لااقل آدرس relative بده نه آدرس کامل چون مثلا من درایو A ندارم، پس کافیه به جای کل آدرس بنویسی index.htm)
لطفا کدهای دو کلاس بعدی رو بعد از تغییر تو تگ JAVA همینجا بذار، چون زیاد نیستن نیازی به آپلود پروژه نیست.
silverado1371
جمعه 11 تیر 1395, 04:55 صبح
درود بر شما استاد عزیز
من کد ویرایش شده شمارو وارد کردم ! و وارد کلاس ساخت فایل اچتمل شدم. متدهای ساخت فایل رو انجام دادم اما زمانی که خواستم متدی رو که قراره content هایی رو که در InputStream قرار دارند رو درون فایل html کپی کنه رو پیاده سازی کنم! کاملا هنگ کردم و هرچی فکر کردم راهی به ذهنم نرسید و نتونستم اینکار رو بکنم !! پس یخورده سرچ کردم که ببینم چطور میشه یه جریان خروجی رو تو یه فایل ذخیره کرد ولی بازم به نتیجه نرسیدم !! لطفا دوباره چک کنید ببینید من چرا نتونستم خروجی بگیرم!! تنها اتفاقی که افتاد این بود که تو مسیر ریشه پروژه فایل index.htm رو تونست بسازه !! لطفا درباره آدرس دهی نسبی هم کمی توضیح بدید تا بتونم مثلا تو پوشه Documents کاربری که برنامه رو اجرا می کنه این فایل بصورت خودکار ساخته بشه!!
با تشکر خیلی خیلی فراوان که وقتتون رو برای یاد گیری من صرف می کنید !!
کد های کلاس UrlContentUtils
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class UrlContentUtils {
private URL addressUrl;//An object to send "URL" to the URL class constructor
private HttpURLConnection siteConnection;//To open connect URL and send requaird
private int contentLength = 0;//Variable to store the size of length content
private InputStream urlStream;//?
//Added a constructor
public UrlContentUtils(String url) {
setUrl(url);
}
//Added a method to set URL by input argumant
private void setUrl(String url) {
try {
addressUrl = new URL(url);
} catch (Exception ex) {
System.out.println(ex.toString());
}
}
public InputStream getContentStream() {//?
try {
siteConnection = (HttpURLConnection) addressUrl.openConnection(); //To Open Connection not send request
//You can add some parameters and headers
siteConnection.connect();//Added statment: To send parameters
if (siteConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {//Added statment: To check if http response status is OK(200)
contentLength = siteConnection.getContentLength();
if (contentLength != 0) {
urlStream = siteConnection.getInputStream();
} else {
System.out.println("Sorry! ther is no content!");
}
}
} catch (Exception ex) {
System.out.println(ex.toString());
}
return urlStream; //It is null, if response status is not OK(200) or respose has no body(for empty pages)
}
}
کدهای کلاس FileManagements
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Formatter;
import java.util.Scanner;
public class FileManagements {
private Formatter htmCreater;//To creat .htm file
private File checkFileExist;//To write in to the file
private Scanner readFile = null;
InputStream convertInputToFile = null;
public void createHtmFile()//method to created htm file
{
try
{
htmCreater = new Formatter("index.htm");
System.out.println("File created completed successfully.");
}
catch(Exception ex)
{
System.out.print(ex.toString());
}
}
public void writeInToTheHtmFile(InputStream setContentUrl)//To write content in to the htm file from InputStream
{
checkFileExist = new File("index.htm");
if(checkFileExist.exists())
{
try {
InputStream convertInputToFile = setContentUrl;
convertInputToFile = new FileInputStream(checkFileExist);
} catch (Exception ex) {
System.out.print(ex.toString());
}
}
}
//Read .htm file content
// public Scanner htmFileReader()
// {
// try
// {
// while(readFile.hasNext())
// {
// readFile = new Scanner(new File("index.htm"));
// }
// readFile.close();
// }
// catch(Exception ex)
// {
// System.out.println(ex.toString());
// }
//
// return readFile;
// }
}
کدهای کلاس RunProg
import java.util.*;
public class RunProg {
public static void main(String[] args) {
Scanner getMyInput = new Scanner(System.in);
System.out.print("Please enter the website address you want to be saved : ");
String url = getMyInput.next();
UrlContentUtils urlObj = new UrlContentUtils(url);
FileManagements fileObj = new FileManagements();
fileObj.createHtmFile();
fileObj.writeInToTheHtmFile(urlObj.getContentStrea m());
}
}
ممنون
ghamgin
جمعه 11 تیر 1395, 07:46 صبح
آیا راهی هست که در برنامه یه باتن باشه که کاربر که روش کلیک کنه بتونه یه فایل html که روی گوشی هست و شامل فایل css و js هست رو انتخاب کنه و اجرای کنه توی یک وب ویو؟؟؟
ممنون
vahid-p
جمعه 11 تیر 1395, 15:54 عصر
پیشرفتت عالی بود. فقط برای خروجی از FileOutputStream استفاده میشه نه FileInputStream
همچنین این کد:
InputStream convertInputToFile = setContentUrl;
convertInputToFile = newFileInputStream(checkFileExist);
ابتدا convertInputToFile برابر setContentUrl گذاشتی، و بعد برابر new File... که مقدار اولی از دست میره! (هرچند مقدارش رو به عنوان پارامتر داریم، ولی خط اول اضافه بود)
کد کلاس FileManagements رو تغییر دادم به:
import java.io.File;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
public class FileManagements {
//Deleted field: private Formatter htmCreater;//To creat .htm file
//private File outputFile;//private File checkFileExist;//To write in to the file
private String filePath; // Added statement
//Deleted field:private Scanner readFile = null;
//Deleted field:InputStream convertInputToFile = null;
//Added constructor
public FileManagements(String filePath) {
this.filePath = filePath;
}
public boolean writeInToTheHtmFile(InputStream contentStream)//To write content in to the htm file from InputStream
{
File outputFile = new File(filePath);
if (outputFile.exists()) {
return false;//if file exists, don't rewrite!
} else {
FileOutputStream fileWriter = null;
byte[] buffer=new byte[64*1024];
try {
fileWriter = new FileOutputStream(outputFile);
if (outputFile.exists()) {
try {
while((contentStream.read(buffer))!=-1){//Read from input stream
fileWriter.write(buffer);//write to output stream
}
} catch (Exception ex) {
System.out.print(ex.toString());
}
}
return true; //After finally block is executed, it is returned
} catch (FileNotFoundException ex) {
Logger.getLogger(FileManagements.class.getName()). log(Level.SEVERE, null, ex);
} finally {//Always make sure you close streams (better to be in finally block)
if(fileWriter!=null){
try {
fileWriter.close();
} catch (IOException ex) {
Logger.getLogger(FileManagements.class.getName()). log(Level.SEVERE, null, ex);
}
}
}
return false;//if there was an Exception, after finally block, it is returned
}
}
}
راستی یه توضیح در مورد finally block بدم:
اگر در try ... catch ... finally یک خطای استثنا (Exception) رخ بده، خب بدنه try از جایی که خطا رخ داده به بعد اجرا نمیشه و در عوض catch اجرا میشه. همچنین چه try کامل اجرا بشه، چه قسمتی اجرا بشه و catch هم اجرا بشه، چه در هر قسمتی return رخ بده، finally اجرا خواهد شد. البته return قبل از try باعث میشه اصلا وارد محدوده کد try...catch...finally نشی و در نتیجه finally اجرا نمیشه. پس فقط در صورتی که وارد محدوده شدیم حتی اگر return در اون محدوده انجام بشه قبلش finally اجرا خواهد شد.
پس return true وقتی رخ میده که تمام بدنه try به درستی انجام شده، سپس finally انجام بشه و بعد return true خواهد شد.
اما return false آخر، وقتی رخ میده در try مشکلی پیش اومده باشه و exception رخ بده (در نتیجه ادامه try انجام نمیشه و به return true نخواهد رسید). با رخ دادن exception قسمت catch اجرا خواهد شد و فارغ از اینکه اصلا return false داریم یا نه، باید finally انجام شود و محدوده تکمیل بشه. بعد از محدوده try...catch...finally کدهای بیرون از اون اجرا میشن تا به آخر متد برسیم. پس return false رخ خواهد داد.
البته میتونی به روش های مختلفی پیاده سازی کنی، این یکیش بود.
--- اگر فکر میکنی ابهامی وجود داره بپرس
silverado1371
جمعه 11 تیر 1395, 18:47 عصر
درود استاد عزیز !! با دیدن کد شما الان هنگ هنگم و کاملا به چالش کشیده شدم :افسرده: من باید بشینم هر دو کد شما رو بررسی کنم ! سعی میکنم یک بار دیگه مطالب Streamها رو مطالعه کنم! فک می کنم مشکلم اینه که درک خوبی از Stream ندارم !! سوالاتمو تو پست بعدی میپرسم !! بازم تشکر می کنم که توجه می کنید و به سوالات من جواب میدید خیلی خیلی ممنون و متشکرم.
vahid-p
جمعه 11 تیر 1395, 23:15 عصر
Stream نکته خاصی نداره تو این مثال.
کدی که از Stream ورودی میخونه و در Stream خروجی مینویسه اینه:
while((contentStream.read(buffer))!=-1){//Read from input stream
fileWriter.write(buffer);//write to output stream
}
بقیش آماده سازی این خط بود. یه بافر تعریف کردیم (آرایه ای از بایت ها) که با contentStream.read(buffer) اطلاعات ورودی جدید رو در بافر قرار میدیم و پس از اون fileWriter.write(buffer) داخل خروجی که اینجا فایل هست مینویسیم. از اونجایی که بافرمون محدوده (مقدارش رو 64kb گذاشتم)، خب ممکنه این حلقه چندین بار تکرار بشه تا وقتی که اطلاعاتی باقی نمونه و مقدار برگشتی read برابر -1 خواهد شد و از حلقه بیرون میاد.
silverado1371
شنبه 12 تیر 1395, 13:32 عصر
درود استاد عزیز! من هر 2 کلاس رو زیر و رو کردم و کد رو خیلی خوب درک کردم و فقط 2 تا سوال برام پیش اومد ! که یکی از اونها رو بخاطر اینکه اولین باره دارم میبینم میپرسم! البته شما اول کد main رو ببینید شاید من اشتباهی توش دارم و یا نکته ای وجود داره تا من بدونم !! ولی من تونستم کامل خروجی ازش بگیرم و سعی کردم به اون نکاتی که تو کامنتایه کد گذاشته بودید توجه کنم بعد کد بنویسم!
import java.util.*;
public class RunProg {
public static void main(String[] args) {
Scanner getFileAndURL = new Scanner(System.in);
String filePath;
String urlLink;
FileManagements fileUtil = null;
UrlContentUtils urlUtil = null;
System.out.print("Please enter a web address (like = http://www.exampel.com)");
System.out.print("\n URL: ");
urlLink = getFileAndURL.next();
System.out.println();
urlUtil = new UrlContentUtils(urlLink);
if( urlUtil.getContentStream() != null )
{
System.out.print("Please enter a path for save web adress to a .htm file: ");
filePath = getFileAndURL.next();
System.out.println();
fileUtil = new FileManagements(filePath);
if(fileUtil.writeInToTheHtmFile(urlUtil.getContent Stream()) == true)
{
System.out.print("File was Created!");
}
else
{
System.out.print("\nThe file was not created. Perhaps a file with the same name already exists.\n");
}
}
else
{
System.out.print("has a problem with the " + urlLink + " !!");
}
getFileAndURL.close();
}
}
خوب سوالات من :
1- تو کلاس FileManagements خط 25 اون کد برای چی تعریف شده ؟ تو نمونه هایی که من تو وب دیده بودم از یک متغیر از نوع int استفاده میشد و جریان ورودی رو که .read می کردند اون مقدار برگشتی شدو تو اون متغیر int میریختن و بررسی می کردند که این متغیر -1 هست یا نه !! ولی اینجا شما یک کار دیگه کردید !! لطفا این خط رو کامل توضیح بدید ! چون من با buffer آشنا نیستم!
2- کد HttpURLConnection اینو فهمیدم چیه ولی اگه میشه شمام یه توضیح خیلی کوچیک دربارهاش بدید و بگید چرا باید ازش تویه او if استفاده کنیم !!!
باتشکر از شما استاد عزیز (لطفا ایمیل خودتونو برام تو پیام بفرستید تا بتونم از شما تو تمریناتم و سوالاتی که برام پیش میاد کمک بگیرم)
vahid-p
یک شنبه 13 تیر 1395, 10:39 صبح
خب در متد main چند اشتباه (هر چند شاید خیلی حیاتی نباشه) وجود داره:
در خط 21 یک بار getContentStream انجام دادید که نتیجش یک اتصال به آدرس مربوطه و گرفتن یک stream دیتا از اون است. این رو میتونید در خط 27 هم استفاده کنید و در نهایت ببندید
پس خط 27 با urlUtil.getContentStream() یک بار دیگه اتصال برقرار میکنه و stream میگیره. مگر اینکه این موضوع رو هندل کنید که وقتی یک stream ایجاد شده، و درخواست یک stream جدید به همون آدرس باشه و stream قبل مصرف نشده و بسته نشده به جای اینکه دوباره ارتباط برقرار کنه، همون قبلی رو بهت بده. ولی تو کد UrlContentUtils چنین چیزی ننوشتیم.
پس یک متغیر از نوع InputStream درست کن و در هر دو خط از اون استفاده کن.
همچنین این متغیری که تعریف کردی پس از انجام عملیات ذخیره در فایل، چون stream هست close کن. قبلا هم مثالش رو دیدیم (اول null نبودنش رو چک کن و بعد ببندش).
یک نکته کم اهمیت به جای \n در خط 13 کافیه در خط 12 از println به جای print استفاده کنی. خط 23 و 25 هم همینطور. داکیومنت println رو بخون.
1- تو کلاس FileManagements خط 25 اون کد برای چی تعریف شده ؟ تو نمونه هایی که من تو وب دیده بودم از یک متغیر از نوع int استفاده میشد و جریان ورودی رو که .read می کردند اون مقدار برگشتی شدو تو اون متغیر int میریختن و بررسی می کردند که این متغیر -1 هست یا نه !! ولی اینجا شما یک کار دیگه کردید !! لطفا این خط رو کامل توضیح بدید ! چون من با buffer آشنا نیستم!
یه اشتباه جزئی تو اون کد رخ داده (در نوشتن نه در خواندن) که بعد از توضیح read به اون قسمت هم میرسیم.
قبلش لازمه داکیومنت read رو بخونید. چندین متد read داریم.
بافر در این مثال چیز خاصی نیست جز یک آرایه ای از نوع byte . متد read یک پارامتر از نوع آرایه میگیره، اطلاعات ورودی رو در اون آرایه مینویسه ولی مقدار برگشتیش آرایه نیست بلکه یک عدد هست. این عدد مقدار برگشتی در اصل تعداد خانه هایی است که از ورودی خوانده. خب اگر تعداد خوانده شده برابر -1 بود یعنی اطلاعاتی خوانده نشده. اینکه شما بنویسید:
while((contentStream.read(buffer))!=-1){//Read from input streamابتدا read(buffer) انجام میشه و مقدار برگشتیش جای کل عبارت (contentStream.read(buffer)) قرار میگیره و با -1 مقایسه میشه. میتونیم هم خروجیش رو در یک متغیر بریزیم و مقایسه کنیم.
اشتباه من این بود که تعداد دیتا خونده شده رو کاریش نداشتم و برای همین هم داخل هیچ متغیری نریختم و مستقیم مقایسه کردم. اما نه برای خواندن بلکه برای نوشتن به اون مقدار خونده شده نیاز داریم.
این کدی که من نوشتم و برای نوشتن اشتباهه:
fileWriter.write(buffer);//write to output stream
تمام آرایه buffer رو در خروجی مینویسه، و تا یکی قبل از آخرین حلقه درسته، اما در آخرین حلقه ممکنه اطلاعات کل آرایه رو پر نکنه و اطلاعات الکی در خروجی نوشته میشه.
پس ما به تعداد خوانده شده نیاز داریم.
همونطور که متد read انواعی داشت، متد write هم انواعی داره. متدی که من استفاده کردم write(byte[] b) بود که در داکیومنتش اومده:
Writes b.length bytes from the specified byte array to this file output stream.
ولی از متدی که میخوام استفاده کنم write(byte[] b, int off, int len) است که در داکیومنتش نوشته:
Writes len bytes from the specified byte array starting at offset off to this file output stream.
همونه که میخوایم.
البته میتونی از جفت توابع read() بدون پارامتر و write(int b) استفاده کنی که یکی یکی بایت ها رو میخونه و در خروجی مینویسه.
برگردیم سر اصل مطلب. پس کد FileManagements رو تغییر میدیم:
int len;
while((len=contentStream.read(buffer))!=-1){//Read from input stream
fileWriter.write(buffer,0,len);//write to output stream
}
خب مشکل حل شد. البته کلاس های ساده تری برای اینکار وجود داره، ولی برای کپی کردن (بدون هیچ پردازشی) این خوبه.
2- کد HttpURLConnection اینو فهمیدم چیه ولی اگه میشه شمام یه توضیح خیلی کوچیک دربارهاش بدید و بگید چرا باید ازش تویه او if استفاده کنیم !!!
دقیق متوجه نشدم. اگر منظورتون:
if (siteConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {//Added statment: To check if http response status is OK(200)
است دلیلش اینه هر بسته Response در HTTP یک کد وضعیت و یک توضیح داره. اگر درخواست به خوبی انجام شده باشه کد وضعیتش 200 و توضیحش OK است.
وقتی موفقیت آمیز باشه اطلاعات داخلش بدردمون میخوره و اگر موفقیت آمیز نبوده که اطلاعاتش به دردتون نمیخوره. (در مورد HTTP کد 200 رو سرچ کن https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Status_codes)
اگر منظورت HttpURLConnection.HTTP_OK است باید بگم این یک عدد ثابته. خیلی اوقات برای اینکه حفظ کردن اعداد سخته یا بخوایم یه جا عدد رو تغییر بدیم و همه جا تغییر کنه، از چنین ثابت هایی استفاده می کنیم که خیلی کارکردن باهاشون راحتتره تا استفاده از عدد. همونطور که گفتم در IDE های Netbeans, Eclipse, Intellij,... کافیه با گرفتن Ctrl و کلیک روی متد، فیلد، کلاس سورسش رو ببینی. برای این مورد در کلاس HttpURLConnection داریم:
public static final int HTTP_OK = 200;
silverado1371
یک شنبه 13 تیر 1395, 11:37 صبح
سلام استاد ! کاملا متوجه شدم ! کد رو تغییر دادم - یک متغیر از نوع inputStream تعریف کردم و بعدش مقدار بازگشتی ContentStream رو توش ریختم تا عمل فراخوانی تابع یک بار انجام بشه و یک بار stream دیتا بگیره ! بعد اونم داخل یک try finally ازش استفاده کردم که در آخر شی inputStream رو ببندم.
در مورد HTTP اونجوری که از ویکی پدیا خوندم زمانی که از http 1.0 به بعد زمانی که یک درخواست برای سرور از طرف کاربر ارسال میشه! Http یک کد برای کاربر (مرورگر با هرچی...) میفرسته که با یکی از این اعداد (1xx.2xx.3xx.4xx.5xx) شروع میشه !! که ما با عدد 200 کار داریم چون منظور اینه که درخواست کاربر با موفقیت انجام شده!! پس ما به محتوای صفحه متصل هستیم!!
اینم کد main بعد از اعمال تغییرات
import java.io.InputStream;
import java.util.*;
public class RunProg {
public static void main(String[] args) {
Scanner getFileAndURL = new Scanner(System.in);
String filePath;
String urlLink;
FileManagements fileUtil = null;
UrlContentUtils urlUtil = null;
InputStream inputContent = null;
System.out.println("Please enter a web address (like = http://www.exampel.com)");
System.out.println("URL: ");
urlLink = getFileAndURL.next();
System.out.println();
urlUtil = new UrlContentUtils(urlLink);
try
{
inputContent = urlUtil.getContentStream();
if( inputContent != null )
{
System.out.print("Please enter a path for save web adress to a .htm file: ");
filePath = getFileAndURL.next();
System.out.println();
fileUtil = new FileManagements(filePath);
if(fileUtil.writeInToTheHtmFile(inputContent) == true)
{
System.out.print("File was Created!");
}
else
{
System.out.print("\nThe file was not created. Perhaps a file with the same name already exists.\n");
}
}
else
{
System.out.print("has a problem with the " + urlLink + " !!");
}
}
finally
{
if(inputContent != null)
{
try {
inputContent.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}
getFileAndURL.close();
}
}
}
با تشکر
vahid-p
یک شنبه 13 تیر 1395, 12:29 عصر
یه نکته دیگه یادم رفت بگم، به نظرم بد نیست این رو هم اعمال کنی:
شما بعد از ایجاد connection به سایت مقصد، منتظر میمونید تا کاربر اسم فایل رو وارد کنه و بعد از stream ورودی بخونه و داخل فایل بنویسه.
خب ممکنه کاربر بلافاصله اسم فایل رو وارد نکنه و یک ساعت بعد بیاد اسم رو وارد کنه. خب تا اون موقع Connection باز میمونه تا اطلاعات رو بخونی. این از سمت کاربر مشکلی ایجاد نمیکنه، اما تضمینی نیست که سرور مقصد اتصال رو برقرار بذاره و ممکنه اتصال رو قطع کنه.
هر چند من سایت گوگل رو تست کردم، 3 دقیقه بعد از برقراری connection باز هم connection برقرار بود و اطلاعات به درستی ذخیره شد. اما باز هم میگم ممکنه همیشه اینطور نباشه.
پس بهتره اول اسم سایت و فایل رو بگیری و بعد بلافاصله پس از برقراری connection، فایل رو ذخیره کنه.
موفق باشید
silverado1371
یک شنبه 13 تیر 1395, 15:42 عصر
یه نکته دیگه یادم رفت بگم، به نظرم بد نیست این رو هم اعمال کنی:
شما بعد از ایجاد connection به سایت مقصد، منتظر میمونید تا کاربر اسم فایل رو وارد کنه و بعد از stream ورودی بخونه و داخل فایل بنویسه.
خب ممکنه کاربر بلافاصله اسم فایل رو وارد نکنه و یک ساعت بعد بیاد اسم رو وارد کنه. خب تا اون موقع Connection باز میمونه تا اطلاعات رو بخونی. این از سمت کاربر مشکلی ایجاد نمیکنه، اما تضمینی نیست که سرور مقصد اتصال رو برقرار بذاره و ممکنه اتصال رو قطع کنه.
هر چند من سایت گوگل رو تست کردم، 3 دقیقه بعد از برقراری connection باز هم connection برقرار بود و اطلاعات به درستی ذخیره شد. اما باز هم میگم ممکنه همیشه اینطور نباشه.
پس بهتره اول اسم سایت و فایل رو بگیری و بعد بلافاصله پس از برقراری connection، فایل رو ذخیره کنه.
موفق باشید
واقعا نکته خیلی خوبی بود ! به اینش فکر نکرده بودم!!
import java.io.InputStream;
import java.util.*;
public class RunProg {
public static void main(String[] args) {
Scanner getFileAndURL = new Scanner(System.in);
String filePath;
String urlLink;
FileManagements fileUtil = null;
UrlContentUtils urlUtil = null;
InputStream inputContent = null;
//get URL
System.out.println("Please enter a web address (like = http://www.exampel.com)");
System.out.println("URL: ");
urlLink = getFileAndURL.next();
System.out.println();
//Get file path
System.out.print("Please enter a path for save web adress to a .htm file: ");
filePath = getFileAndURL.next();
System.out.println();
urlUtil = new UrlContentUtils(urlLink);
try
{
inputContent = urlUtil.getContentStream();
if( inputContent != null )
{
fileUtil = new FileManagements(filePath);
if(fileUtil.writeInToTheHtmFile(inputContent) == true)
{
System.out.print("File was Created!");
}
else
{
System.out.print("\nThe file was not created. Perhaps a file with the same name already exists.\n");
}
}
else
{
System.out.print("has a problem with the " + urlLink + " !!");
}
}
finally
{
if(inputContent != null)
{
try {
inputContent.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}
getFileAndURL.close();
}
}
}
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.