• ベストアンサー

javaで大きなファイルを解析できますか?

100MBくらいのアクセスログをjavaを使って解析しようと思うのですが、どうしても、エラーが出ます。 読み込み方が間違っているのでしょうか? まったくわかりません。 教えていただけないでしょうか? また、これを知ったきっかけも教えていただけましたら幸いです。 宜しくお願い致します。 読み込みの部分↓↓↓ class kaiseki { public static void main(String[] args) throws Exception { InputStream is = new FileInputStream("log.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(is));

  • Java
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
noname#30871
noname#30871
回答No.3

>これでは、まずいのでしょうか?  Javaが扱えるメモリの最大量は、デフォルト値(J2SEのバージョンやプラットホームに依存)が決まっています。実メモリをいくら多く積んでいようが、その値以上は使われません。デフォルト値以上のメモリをJavaで使いたい場合は、javaコマンドの起動オプションで指定します。 >すべての情報が100Mで1行  本当にそうなっていますか? ログファイルはたいてい、レコード(一回のアクセス記録)の区切りが改行になっているかと思います。  ただしWindowsのメモ帳などは、「CRLF」のみを改行コードだと認識します。ファイル内で「CR」または「LF」が改行コードに使われている場合は、メモ帳は改行だと認識せずに、あたかも1行のファイルであるかのように表示します。  ともあれ、今回のログファイルのレコード区切り文字をご確認ください。 >以下、もしお時間がありましたら教えてください。  話題が変わる場合は、別に質問を立てるほうがよいです。  さて既存のコードをお手本にするのは、プログラミング学習の基本であり、それでよいと思います。  ただし多くの学習者は「エラーが出た⇒思考停止」になってしまいます。  エラーメッセージはバグの最大の手がかりですから、これをよく読んで原因を考えるべきです。  どうしても検討できなければ、エラーメッセージをGoogle検索にかければ問題点がわかることがあります。  「エラーを一つ直すごとにプログラミングが一歩上達する」と思ってください。

その他の回答 (2)

noname#30871
noname#30871
回答No.2

 質問文の中のソースはストリームの生成までですが、その後の読み込みの処理はどうなっているでしょうか。  読み込んだファイルの内容をすべて変数に保持しようとしていませんか。100MBのファイルに対してそうしていれば、当然メモリ不足に陥ります。  アクセスログのようなファイルでしたら、BufferedReaderのreadLine()で1行単位で読み込む方法がよいと思います。  また一般に、プログラミングの相談の際にはぜひとも >正確なエラー情報 をお願いします。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/io/BufferedReader.html
tihiro_t
質問者

補足

回答いただきありがとうございます。 >読み込んだファイルの内容をすべて変数に保持しようとしていませんか。 正に、その通りです。これでは、まずいのでしょうか?(PCのメモリは512MBあるので大丈夫かと思ったのですが・・・) また、logファイルの性質上、すべての情報が100Mで1行で作成されています。そのため、1行という単にはありません。 何かよい方法はないでしょうかね?  また一般に、プログラミングの相談の際にはぜひとも >正確なエラー情報 をお願いします。 指摘ありがとうございます。以降気をつけます。 以下、もしお時間がありましたら教えてください。(相談です) 多分、上記のような質問は初歩的?なのかも知れませんが、私には、正直、ほとんど、理解できていません。今までも、ネット上からソースをコピペして貼り付けてエラーがでなければよしとしてやってきています。それでもわからなければ人に聞く。というやり方。 しかし、できれば、人に迷惑をかけることなく、効率的にバリバリプログラムを勉強したいと思っていますが、どういった勉強方法が考えられますか?もしよろしければ、教えてください。 よろしくお願いいたします。

noname#86752
noname#86752
回答No.1

どのようなエラーが出てるのでしょう?

tihiro_t
質問者

補足

回答いただきありがとうございます。 具体的には、プログラム実行中にフリーズしてしまって解析ができない。 運良く解析できても、出力のところでファイルに書き込みができませんでした。の旨のエラーが出ます。(正確なエラー情報は忘れてしまいました。すみません。) 出力には、下記の命令のみを使っています。 fr = new FileWriter("出力.txt"); あと、あまり関係ないかもしれませんが、、入力には、Buffered~を使っていますが、出力には、Buffered~は使っていません。

関連するQ&A

  • javaについて>IEのクッキーを使いたい

    IEでログインした状態であれば、ヤフーメールなどクッキーを使うHPにアクセスできるかと思ったのですがアクセスできません。どうすればよいでしょうか? 多分、javaはIEのクッキーを利用していないのですよね・・・ 何とか、IEのクッキーを利用できれば良いのですが。何か、良いお知恵はありませんでしょうか? 宜しくお願い致します。 以下、コードです。 ーーーーーーーーーーーーーーーーーーーーーーー import java.io.*; import java.net.*; class Test { static String input() throws IOException { InputStream is = new FileInputStream("url.txt");//urlを入力 BufferedReader br = new BufferedReader(new InputStreamReader(is)); String str = br.readLine(); return(str); } static void read(String str) throws IOException { OutputStream os = new FileOutputStream("log.txt",true); BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os)); URL url = new URL(str); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); for (;;) { String i = in.readLine(); if(i == null) { break; } System.out.println(i + "\n"); fr.write(i + "\n"); } in.close(); fr.close(); } public static void main(String[] args) throws IOException { Test brow = new Test(); brow.read(brow.input()); } }

    • ベストアンサー
    • Java
  • 今勉強中のjavaで。わからないことがあります。

    import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int num =Integer.parseInt(str1); System.out.println("あなたは" + num +"歳です。"); } } ------------------------------- import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("あなたは" + str1 +"歳です。"); } } なぜ下では悪いのですか?なぜnum をつかないといけないかがわかりません。正確には str1とnumの違いがわからなくて困っています。何が混乱の原因ですか?

    • ベストアンサー
    • Java
  • java わからない。

    今、卒業研究でJAVAを扱っています。 しかし、思った動作をするプログラムが作れません。 時間もなくなってきたので、okwaveに投稿しました。 お願いします。 パソコンはwindowsです。 プログラムを実行すると, (1)コマンドプロセッサでdirを実行してくれる。 (2)実行した後にファイルにする。 実行するときは[dir > dir.txt]のようにしたいです。 今まで書いてきた例をいかに描きます。 import java.io.*; public class TestExec1 { public static void main(String[] args) { try { String s1 = "dir"; Process process = Runtime.getRuntime().exec(s1); InputStream is = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } } } どこが間違っているかわかりません。 よろしくお願いします。

  • JavaでString型をChar型に変換するプログラムが分かりません

    JavaでString型をChar型に変換するプログラムが分かりません;; どなかた助けて下さい。 下のプログラムの何がいけないんでしょうか?? いろいろ間違ってるところはあると思うんですが、教えて下さい! import java.io.*; class { public static void main(String args[]) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); StringBuffer moji = new StringBuffer(str1); char nyuu=moji;

  • 例外(throws)について

    例外のthrowsがよくわかりません。 (例1) public static void main(String[] args) throws Exception { new testClass().testA(); } void testA() throws Exception { FileReader exFile = new FileReader("exFile.txt"); } (例2) public static void main(String[] args) throws FileNotFoundException { new testClass().testA(); } void testA() throws FileNotFoundException { FileReader exFile = new FileReader("exFile.txt"); } 上記2つの例ではどちらも 「java.io.FileNotFoundException: exFile.txt (指定されたファイルが見つかりません。)」 というログが出力されるようです。 throws ExceptionにしてもFileNotFoundExceptionと判別できるのならば、 あえてthrows FileNotFoundExceptionにする必要がなく、大抵の場合 throws Exceptionにしておけばよいと思うのですが、 その解釈は間違っているでしょうか?

    • ベストアンサー
    • Java
  • javaについて質問させてください

    入力していった数を足していく式を作りたいんですが、どのような式にしたらいいのでしょうか? ググってみたのですが、どうも難しく、説明の理解もできませんでした。。 import java.io.*;public class Input6{ public static void main(String args[]) throws IOException{ int i; String s1,s2; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); while( ↑ここまではできたのですが、ここから先が全くできません><(合ってるかどうかもわかりません><) 実行結果として >java ry 合計 100 現在の合計100 900 現在の合計1000 みたいな感じのを作りたのですが、どなたか式を教えてもらえませんか>< ヒントでもいいのでよろしくお願いします><

  • キーボードからの文字列検索

    いつもお世話になっております。 文字列検索をするプログラムを作っているのですが、キーボードから検索したい文字を入力して検索する方法がわかりません。コマンドラインからの検索はできたのですが、スペースが入ると思うように検索できないんです。 どなたかご教授頂けると大変うれしいです。 よろしくお願い致します。 import java.io.*; import java.util.*; class Search{ public static void main(String[] args) throws IOException, InterruptedException{ FileInputStream fis = new FileInputStream("input.txt"); InputStreamReader in = new InputStreamReader(fis); BufferedReader br = new BufferedReader(in); String msg = br.readLine(); Camera mySearch = new Camera(); String target = (args[0]); mySearch.setFocus(target.length()); BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); System.out.println(msg); for(int i = 0; i < msg.length(); i++ ){ mySearch.shift(msg.charAt(i)); if(mySearch.compare(target)){ System.out.println("Pattern '" + target + "' is found at index of " + (i - target.length() + 1)); break; } } } }

  • Java int sum = 0は必要ですか?

    やさしいJavaという本を買ったのですが、良くわからない箇所がありました。 --------------省略----------------- class Sample6 { public static void main(String[] args) throws IOException { System.out.println("整数を3つ入力してください。") ; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ; String str1 = br.readLine() ; String str2 = br.readLine() ; String str3 = br.readLine() ; int sum = 0 ; sum += Integer.parseInt(str1) ; -------------------略----------------- int sum = 0 ; とありますが、0と設定しておく必要はありますか? 無いとまずいですか? いきなりこのコードが出てきたと思うのですが どこかに書いてましたっけ?

    • ベストアンサー
    • Java
  • Javaでよくわからないエラーが出てしまいます。

    こんにちは。 Javaでプログラムを作っている途中で ArrayIndexOutOfBoundsException というエラーが出てきました。 調べてみると"配列として確保された領域を 超えた場所アクセスした場合に発生"と書かれていました。 しかし、エラーの部分を見つけることができません。 以下に問題のプログラムを掲載します,問題点を指摘してもらいたいのです。 よろしくお願いします。 ちなみに開発環境はJava7です。 -------------以下プログラム------------- import java.io.*; public class Datain{ public static String[][] datain(){ String inputFileName; String indata_1; String[] indata_2 = new String[12]; String[][] mondata = new String[100][12]; int i = 0; //読み込むファイル名 inputFileName = "H:\\問題データ.txt"; //ファイルオブジェクトの生成 File inputFile = new File(inputFileName); try{ //入力ストリームの生成 FileInputStream fis = new FileInputStream(inputFile); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); //テキストファイルからの読み込み while((indata_1 = br.readLine()) != null){ indata_2 = indata_1.split(","); for(int z = 0;z < indata_2.length;z++){ mondata[i][z] = indata_2[z]; } i++; } br.close(); }catch(Exception e){ e.printStackTrace(); } return mondata; } public static void main(String[] args){ String[][] a; a = datain(); System.out.println(a[0][0]); } } -------------テキストファイル------------- あいう,えおか,きくけ こさし,すせそ,たちつ てとな,にぬね,のはひ ※カンマ区切りの「.txt」ファイル

    • ベストアンサー
    • Java
  • プログラムの組み合わせ方

    java初心者です。 2つのプログラムを組み合わせて1つのプログラムにしたいんですが、イマイチ分かりません。 このプログラムと、 import java.io.*; class Hello2 {  public static void main(String[] args) throws IOException {   System.out.println("名前を入力してください");   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   String str = br.readLine();   System.out.println(str + "さん、こんにちは!");  } } このプログラムを、 import java.io.*; class Sanbai{  public static void main(String[] args) throws IOException {   System.out.println("好きな数を入力してください");   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   String str = br.readLine();   int x;   x = Integer.parseInt(str);   System.out.println("あなたの入力した数:" + x);   System.out.println("その3倍の数:" + (x*3));  } } 組み合わせて1つのプログラムにするにはどうしたらいいですか?(>_<)

    • ベストアンサー
    • Java