• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ファイル内の1行(レコード)から指定バイト数だけを読込みたい。)

ファイル内の特定バイト数を読み込む方法とエラーハンドリングについて

erichgummaの回答

回答No.4

ByteBufferじゃ駄目なんですか? ... import java.nio.*; ... private static final int BSIZE = 1024; ... ByteBuffer buff = ByteBuffer.allocate(BSIZE); ... http://okwave.jp/qa/q5981150.html 改行は portability を考慮した public static final String NEWLINE = System.getProperty("line.separator"); を用いるのが、リファクタリング上、推奨されます。

daiou5
質問者

お礼

ありがとうございます。 ByteBufferなるものがあるのですね。 これもまた詳しくみておきます。(ただ今回はBefferedReaderクラスを使います) System.getProperty("line.separator"); ↑これについては、実際の処理ではバイト単位で読込んでいるのに対し、 これは「\r\n」で取れてくる(String型)なので処理ができなくなってしまいます。

関連するQ&A

  • Fileから指定した行を読み取りたい

    現在、例えば1300行目を読み取りたいとしたときに、今現在の私のやり方では、 FileInputStream fis = new FileInputStream("xxxxxx.txt"); InputStreamReader ir = new InputStreamReader(fis , "SJIS"); BufferedReader br = new BufferedReader(ir); String ch; int count=0; while((ch = br.readLine()) != null){  count++;  if(count == 1300)    break; } System.out.println("指定行の内容は:"+ch); br.close(); のように、1300回行を読んだらその内容を出力するようにしているのですが、これは、かなり無駄があると思うのです。なので、指定した行に読み込みヘッダを移動して、その指定した行を読み取りたいのですが、指定行を一発で読み取ることはできますか? skip(long numChars)メソッドを使用することを考えましたが、ファイルの各行のバイト数は各行ごとに異なるので、規則性がなく無理であると考えあきらめました。

  • Javaでのカンマで配列を分ける方法

    こんにちは。 カンマ区切りで入力されているデータを2次元配列に格納したいのですがよくわかりません。 それとデータをtxtファイルから入力する方法で配列を入力した分だけ作ることはできますでしょうか? 現在のプログラムは最初に配列を1000個用意する形になっているので効率的とは言えないと思うのですが・・・。 以下プログラムを載せます。 public String[] datain(){ String[] data = new String[1000]; String inputFileName; int i = 0; // 読み込むファイルの名前 inputFileName = "D:\\a.txt"; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); try { // 入力ストリームの生成 FileInputStream fis = new FileInputStream(inputFile); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); // テキストファイルからの読み込み String d; while ( ( d = br.readLine()) != null ) { data[i] = d; i += 1; } br.close(); } catch(Exception e) { e.printStackTrace(); } return data; } というメソッドです。 戻り値を返した後でも前でもいいので、 --データ-- (a.txt) あ,い,う,え,お か,き,く,け,こ さ,し,す,せ,そ ↓このように取り込みたいのです。 --配列-- [0,0] = あ  [0,1] = い  [0,2] = う  [0,3] = え  [0,4] = お [1,0] = か  [1,1] = き  [1,2] = く  [1,3] = け  [1,4] = こ [2,0] = さ  [2,1] = し  [2,2] = す  [2,3] = せ  [2,4] = そ よろしくお願いします。

    • ベストアンサー
    • Java
  • 開いたファイルをJListに追加したい

    最近、Swingを勉強し始めたばかりです。 開くボタンを作りファイルチューザでcsvファイルを開き、1行ずつ引っ張り出してきて全データをJListに表示したいのですがうんともすんともいいません。 知恵をお貸しくださいお願いします(T_T) 鈴木一郎,東京都,渋谷110,1960 松井一郎,大阪府,大阪市119,1928 class SwingTest extends JFrame implements ActionListener{ private static JFrame frame; private JFileChooser chooser = new JFileChooser(); private Container pane = getContentPane(); private DefaultListModel myList = new DefaultListModel(); 略 public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); if(s.equals("Open")==true){ JFileChooser chooser = new JFileChooser(); int returnval = chooser.showOpenDialog(this); li.setPreferredSize(new Dimension(500,300)); if(returnval == JFileChooser.APPROVE_OPTION){ File file = chooser.getSelectedFile(); FileInputStream fis = new FileInputStream( file ); InputStreamReader isr = new InputStreamReader( fis ); BufferedReader br = new BufferedReader( isr ); String line = br.readLine(); String[] token = line.split(","); String str = token[0] + "\t" + token[3]; myList.addElement(str); li.setModel(myList); }

    • ベストアンサー
    • Java
  • Arraylistを使用し売上集計のコード作成

    プログラミング課題で質問です。 売上集計でCSVからデータを読み込み 支店データ 000,沖縄 001,北海道 というデータファイルと 商品データ SE001,テレビ SE002,レンジ というデータファイル 売上データ”.rcd”拡張子ファイル 支店:001 商品:SE001 売上金額:29800 というデータが入っているファイル この3つのファイルをArraylistを使用し作成しています 最後は支店ごとの売上金額と商品ごとの売上金額を 集計しなければなりません。 理想では売上データファイルと商品データファイルの3項目に売上金額の項目を追加する ように作成したいです。 初心者でわかりにくい説明だとは思うのですが ご指導ください。 いきずまってしまって進めません。 考え方などもまだまだなので一応今できているコードを記載します 途中までですが。。。。。。。 解説などで教えてもらいたいです。 *********************************public class UriageSyukei { public static void main (String[] args) { //指定されたディレクトリ File directory = new File(args[0]); /* * 1.支店定義ファイル * */ File branchFile = new File(directory + "\\branch.lst"); //変数を宣言 FileInputStream fis = null; InputStreamReader isr = null; BufferedReader br = null; ArrayList<List<String>> branchData = new ArrayList<List<String>>(); //支店定義ファイル処理 try { if (!branchFile.exists()) { System.out.println("支店定義ファイルが存在しません"); return; } fis = new FileInputStream(branchFile); isr = new InputStreamReader(fis); br = new BufferedReader(isr); String line ; while ((line = br.readLine()) != null) { List<String> branch = line.split(","); //配列の長さ if (branch.length != 2 || branch[0] == null || branch[1] == null) { System.out.println("支店定義ファイルのフォーマットが不正です"); return; } branchData.add(branch); } /* * 2.商品定義ファイル */ File commodityFile = new File(directory + "\\commodity.lst"); ArrayList<String[]> commodityData = new ArrayList<String[]>(); //商品定義ファイルの処理 if (!commodityFile.exists()) { System.out.println("商品定義ファイルが存在しません"); return; } fis = new FileInputStream(commodityFile); isr = new InputStreamReader(fis); br = new BufferedReader(isr); while ((line = br.readLine()) != null) { String[] commodity = line.split(","); //配列の長さ if (commodity.length != 2 || commodity[0] == null || commodity[1] == null) { System.out.println("商品定義ファイルのフォーマットが不正です"); return; } commodityData.add(commodity); } /* * 3.集計 */ //.rcdに該当する拡張子を検索 ArrayList<String[]> salesData = new ArrayList<String[]>(); String[] salesFiles = directory.list(); for (String salesFile : salesFiles) { if (!salesFile.endsWith(".rcd")) { continue; } File rcdFile = new File(directory + "\\" + salesFile); fis = new FileInputStream(rcdFile); isr = new InputStreamReader(fis); br = new BufferedReader(isr); String salesBranch = br.readLine(); String salesCommodity = br.readLine(); String price = br.readLine(); *************************************** できているのはここまでです。 途中修正などたくさんあると思いますが これを元に作成していきたいので教えてください よろしくお願いします。

    • ベストアンサー
    • Java
  • ファイル読み込みLinux対応

    JAVAでLinuxの環境でファイルを読み込む処理を行っているのですが、文字化けして上手く読み込めません。 環境はLinux 下記のfileNameは、新JISのファイル FileInputStream fis = new FileInputStream(fileName); BufferedReader br = new BufferedReader(new InputStreamReader(fis, "ISO2022JP")); とコーディングしてJISの文字コードを指定してファイルを読み込もうとしたのですが、 sun.io.MalformedInputException のエラーがでて しまいます。 最終的にJISコードをUTF8に変換してDBに書き込んでいます。この変換処理は、うまく行っておりますのでJISのファイルがJISコードとして読み込めれば実現できそうな気がすのですが・・・ 何かよい方法があれば教えて頂けませんか?

    • ベストアンサー
    • Java
  • StringTokenizerについて

    ファイルの読み込みをStringTokenizerを使ってやりたいのですが、 使い方がいまいち理解できません。今自分で作っているプログラムでは効率が悪いです。 プログラムの一部を載せるのでアドバイスお願いします。 <プログラム> InputStreamReader fisr = new InputStreamReader(client. getInputStream()); BufferedReader fin = new BufferedReader(fisr); String name = fin.readLine(); System.out.println(name); while(n!=10){ FileInputStream objFis = new FileInputStream("eitango"+rand[n]+".txt"); InputStreamReader objlsr = new InputStreamReader(objFis,"Shift_jis"); BufferedReader objBr = new BufferedReader(objlsr); PrintWriter out = new PrintWriter(client.getOutputStream(),true); //1行ずつファイルを読み込む if (n==0){ out.println("Hello,clientNo:" + number +"\n"); } for(a=0;a!=6;a++){ if(a==5){ String ans = objBr.readLine(); ans2 = ans.length(); System.out.println("ans2 = "+ans2); } if(a!=5){ out.println(objBr.readLine()); } }

    • ベストアンサー
    • Java
  • CSVファイルの特定の行だけを読み込みたいです。

    例えば以下のようなCSV形式のデータが10000行あるとします。  1,10,15,3  2,1,5,1  70,2,4,2  2,4,5,6  11,1,9,9  ・・・ 上記ファイルから、例えば9999行目を取得したい場合、 現在は以下のような手順で9998行をループで読み込んでから、 9999行目を取得しています。(エラー処理などは省いています)  BufferedReader br = new BufferedReader(new FileReader("hoge.csv"));  for( int i=0; i<9998; i++ ){ br.readLine(); }  System.out.println("9999行目="+br.readLine()); ただし、上記の通りループを9998回まわし、 データを1行ずつ読み込むのは非常に効率が悪いです。 できれば、br.readLine(9999); といった感じで行数を直接指定できる方法があるならば、 無駄な処理を省けて見栄えも速度も良くなると思うのですが、 Javaの標準のクラスではこういったことは可能なのでしょうか? 私なりに調べてみたのですが調べ方が悪いのか知識が及ばないため、 こちらで質問させていただきました。 もしご存知の方がおられましたらアドバイスいただけますと助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaで大容量テキストファイルの読み込みについて

    お世話になっております。 現在javaにて大容量のテキストファイル(100M以上)を読み込んで、 特定の文字が含まれている行のみを別ファイルへ抽出するという プログラムを作成しています。 現在のロジックでは、 File file = new File( "読み込みファイル" ); byte[] b = new byte[ (int) file.length() ]; FileInputStream fis = new FileInputStream(file); fis.read(b); String str = new String(b, "Shift-JIS"); return str; 上記の様なのようなロジックのメソッドを作成し、 返り値の文字列を改行コードでsplitし、パターンマッチングして行を抽出する方法をとっています。 しかしこの方法だと、OutOfMemoryErrorが発生していまい、 30MB以上のファイルを読み込むことができません。 原因がJVMのメモリ領域の問題なのは理解していますが、 readLineをでためしてみると処理終了があまりにも遅すぎるため、 なるべく現在の手法を改良する方向で作成したいのですが、 一回目 :0 ~ 30000000byte まで 二回目 :30000001 ~ 60000000byte まで の様にJVMの設定はいじらない方法でファイルのデータを、 指定バイトから指定バイトまで読み込む方法等なないでしょうか? それ以外でも処理が早く、 大容量のテキストファイルを読み込む方法がありましたら、 そちらでも問題ありません。 ぜひとも知恵をお貸しください。 宜しくお願いします。

    • ベストアンサー
    • 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
  • テキストファイルの行を指定して読み込み

    テキストファイルの読み込みたい行を指定して テキストボックスに表示させたいのですが、 どのようにすればよいでしょうか? StreamReaderには一行分の文字を読み取るReadLine メソッドがありますが、行は指定はできないようです。 良い方法があればアドバイスを頂きたいです。 よろしくお願いします。 --- 開発環境:VS2005 pro OS:Vista