• 締切済み

RandomAccessFileで2GB以上

Java(JDK1.6.0_26)でAndroidアプリを開発しています。 RandomAccessFileを使ってバイナリファイルの一部を読みこむロジックを書いています。 1.8GBのファイルでは問題なく読みこみできますが、3.9GBのファイルではseek時に例外エラー(IOException)が発生してしまいます。 以下コード --------------------------------------------- long lSeekPos ; lSeekPos = 特定の場所を指定 ( 3985344606をセット) File fAccessFile = new File( sFilePath); RandomAccessFile raFile = new RandomAccessFile( fAccessFile, "r"); raFile.seek( lSeekPos) ;   <--ここで例外エラー  ~~以下読み込み処理~~ raFile.close() ; --------------------------------------------- 例外エラーの詳細を調べると "java.io.IOException: Value too large for defined data type" となっています。 API定義を見ている限り seek(long)となっているので、3.9GB位は問題ないと思いますが、何か回避策はあるでしょうか? ■開発環境 WindowsXP SP3 Eclipse 3.5 Galileo JDK 1.6.0_26 AndroidSDK 2.2 以上、宜しくお願い致します。

みんなの回答

noname#147388
noname#147388
回答No.2

失礼なやっちゃな http://guide.okwave.jp/guide/netiquette_amanner.html 「質問内容がよくわからないけど力になりたい」ときは、回答欄を利用して疑問点を質問者に聞いてみよう! 問題解決につながるかも! 抵触してるとおもうなら通報してください。 もし2GBの壁ならOSレベルの問題ですが それでもいいなら解決法 OSを64Bit OSに入れ替えてください。 メモリを増設してください。 2GBの壁 32ビットWindowsアプリケーションでは、1プロセスごとの4GBのアドレス空間うち、カーネルが2GBを予約しており、アプリケーションが自由に使用可能なのは2GBである。この壁に達してくるとマイクロソフトは主に2つの対処手段を打ち出した。1つはアドレスウィンドウ化拡張 (AWE)[14]である。4GBを超えるメモリを部分部分で切り替えながら読み書きする方法であり、MS-DOSの頃のEMSのようだという意見もある[15]。もう1つは、4-Gigabyte Tuning (4GT) の導入である。カーネルとアプリケーションのアドレス空間の配分を通常の2GB-2GBから、1GB-3GBに変更する手法である[11]。カーネルリソースが減少するため、サーバー用途(特にWebサーバー)には安定性の面から向かないという欠点がある。なお、64ビットWindows上では、4GT対応32ビットアプリケーションは4GBほぼすべてアプリケーションが使用可能である[12] Android Phone ではもっと低い位置で壁がきます。

katou527
質問者

お礼

回答ありがとうございます。 失礼な補足を書いてしまいました。お詫びします。 結果としてJavaではRandomAccessFileで2GB以上のファイルを扱えないとのことですのでアプリの要求仕様を変更して問題を回避したいと思います。 2GBの壁ですが、ファイルサイズが符号付Integerの最大値(32bit環境)の2147483647を超えた部分から読み書き、シークなどができなくなります。 投稿後の調査でこれについてはバグ報告されており、回避策はないと書かれていました。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4290024 実は同じ仕様のWindowsアプリ(32bit)をVC++でも開発中です。 そちらではファイルサイズに2GBの上限なくランダムアクセスできるようになっています。 Javaでも同じようにランダムアクセスでファイル入出力したかったのですが、C++の開発が中心でJavaの開発経験が殆どないため、皆さんはどのようにして2GBを超えるファイルにランダムアクセスしているのか知りたかった次第です。(説明不足でしたね) 結論としてランダムアクセスではLargeFileにアクセスできないということで理解しました。

全文を見る
すると、全ての回答が全文表示されます。
noname#147388
noname#147388
回答No.1

2G の壁 じゃないの?

katou527
質問者

補足

2GBの壁かどうかではなくて、2GBを超えるバイナリファイルに対して読み書きを行う場合の手法を教えて欲しかったんですが。。。 ちなみに?をつけるような不明瞭な回答はしないでください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • なぜプロセスはファイルにアクセスできません。

    RandomAccessFileを使用して、ファイルをアクセスすると「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」のメッセージが出力されるときがある。 以下は例です。 <pre> DataInputStream index = null; RandomAccessFile data = null; long seek = 0; int row = 0; try { index = new DataInputStream(new FileInputStream(new File("index.db"))); data = new RandomAccessFile("data.db", "rw"); byte[] buffer = new byte[32]; while (true) { ++row; seek = index.readLong(); data.seek(seek); data.read(buffer); } } catch (EOFException e) { } catch (IOException e) { System.err.println(String.format("[%d]: seek=%d -- エラーの発生したレコード番号.", row, seek)); e.printStackTrace(); } finally { if (index != null) { index.close(); } if (data != null) { data.close(); } } </pre> エラーが発生するレコード位置(row)は、まちまちで実行する度に変化する。 1000件目であったり、157件目であったり。。。 index.dbは約100万件あります。 (a).正常に動作する環境 OS: Windows XP、Windows 7 CPU: Core 2 Duo、CORE i5 (b).エラーが発生する環境 OS: Windows server 2008 R2 standees sp1 CPU: Intel(r) Xeon(r) CPU X5690@3.46GHz (2プロセッサ) どういった原因が考えられますか? 因みに、RandomAccessFileのモードを"r"にすると正常に動作しました。 モードで排他ロックするのでしょうか? RandomAccessFile#getChannel().lock()は使用していません。 (a)の方は最大4コアで、(b)の方は24コアあります。 (b)の方が早すぎてリードにブロックされているとかありますか? ただモードを変更しただけで正常に動作するのも理解できません。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • file操作時のエラー

    現在、Eclipseを開発環境としたJavaでのファイル操作の勉強をしているのですがエラーが出て困っています。 さっそくですがソースを張らせていただきます。 import java.io.*; import java.text.*; import java.util.*; public class Hallo { public static void main(String[] args) { File file = new File("C:\\Tomcat 6.0\\webapps\\blog","coment.txt"); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos , "Windows-31J"); BufferedWriter bw = new BufferedWriter(osw); String msg = "abc"; bw.write(msg); bw.close(); osw.close(); fos.close(); } } この様なソースを書いたところEclipseのエディタ上で 処理されない例外の型 FileNotFoundException 処理されない例外の型 UnsupportedEncodingException 処理されない例外の型 IOException などのエラーがMain分中のほとんどの行で出てしまいます。 しかし、このプログラムをサーブレットとして実装して動作させた場合には特に問題なく動きます。 個人的には開発環境からくるエラーか、それとも別の何か根本的な所で自分が間違っているのではないかと考えています。 みなさんのお返事お待ちしております。

    • ベストアンサー
    • Java
  • 「例外 *** は対応する try 文の本体ではスローされません。」について。

    以下のソースをコンパイルすると, simulator/showManualPage.java:21: 例外 java.net.URISyntaxException は対応する try 文の本体ではスローされません。 } catch (URISyntaxException ex) { ^ simulator/showManualPage.java:23: 例外 java.io.IOException は対応する try 文の本体ではスローされません。 } catch (IOException ex) { ^ とエラーを返されます。 調べたところ、スローされるはずのない例外をキャッチしようとしている、というエラーだとは分かりましたが、スローは書いているので原因が分かりません。 やり方が悪いのでしょうか? package simulator; import java.awt.event.*; import java.awt.Desktop; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class showManualPage implements ActionListener { public void showManualPage() throws URISyntaxException, IOException { // Get Desktop Object Desktop desktop = Desktop.getDesktop(); desktop.browse(new URI("http://google.co.jp")); } public void actionPerformed(ActionEvent event) { try { // Run browser new showManualPage(); } catch (URISyntaxException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • ファイルの排他について

    はじめまして。 初心者ですが、今非常に困っております。 RandomAccessFileを使用して、ファイルの排他をしたいのですが・・・。具体的に言うと、AがAAA.xmlをOPEN中にBがAAA.xmlをOPENしようとするとAがOPEN中なので、例外処理に飛ばしたいのです。いくら試みても例外処理に飛びません。 <例>(java version "1.3.1.05") try { raf = new RandomAccessFile("AAA.xml","rw"); // OPEN raf.writeBytes(111); // WRITE1 raf.writeBytes(222); // WRITE2 raf.writeBytes(333); // WRITE3 raf.writeBytes(444); // WRITE4 raf.writeBytes(555); // WRITE5 raf.close(); // CLOSE } catch(IOException e) { // 排他制御に失敗. リトライしたい System.out.println("別のプロセス?が使用中") }  心当たりのある方がいらしゃいましたら、ご協力お願い致します。

  • close()で例外が投げられる理由

    最近、Java を勉強しはじめておるのですが、ファイル入出力処理で例えば、out.txt なるファイルを出力するサンプルとして FileWriter out = null; try {  wt = new FileWriter("out.txt");  out.write("はろー"); } catch ( IOException e ) {  e.printStackTrace(); } finally {  try {   if (out != null ) out.close();  } catch (IOException e) {   e.printStackTrace();  } } という風に、FileWriter オブジェクト out をクローズする時に IOException 例外が投げられる可能性に対処するため、try / catch でこれをつかまえるように、と聞きました。 そして驚くべきことに、close() が例外を投げた時の catch 節には特に書くべき処理はない、というのです。 そこで質問です。 1. 本当に FileWriter#close() の IOException 例外に対処するためのコードは不要なのですか?(常に握り潰しているだけ?) 2. 対処するコードが不要なら、そもそも FileWriter#close() が IOException 例外を投げる必要がないのではないですか? 長文失礼しました。

  • JDKをインストールしたのですが・・・。

    PC(Win98)にjavaの開発環境を入れようと、java入門書に付随していたCD-ROMからJDKをインストールしたのですが、MS/DOSプロンプトからjavaファイルのコンパイル(javacコマンド)がうまくいきません。javaファイルはサンプルとしてついていたもので、コーディングが間違っているわけでもなく、エラーがあるならでるはずの結果もでてきません。 JDKはSunMicrosystemsの無料配布しているものなのですが、本にはインストール方法が全く載っていませんでした。Win版のexeファイルを実行する他に設定しなければならないことなどあれば教えてください。 お願いします。

    • ベストアンサー
    • Java
  • try catch 文について

    jcpadでプログラムを組んでいます。  コンパイル実行すると 「例外 java.io.IOException は報告されません。スローするにはキャッチまたは、スロー宣言をしなければなりません。」 というエラーがでるのですが、BufferedReaderやDataInputStreamでは 例外処理(try~catch)は必ず書かないといけないんですか?

    • ベストアンサー
    • Java
  • Win SFU (Services for Unix)環境下で2GB超ファイルの末尾を取得したい

    業務上、2GB超のファイルを操作する必要があり、Win2Kを使って、その下でUnixコマンドを使用できるよう、SFU (Services for Unix) を使用しています。 そのシステム上で、2GB超のファイルの末尾nバイトを取得する処理が必要になるのですが、tail -c や、dd 等を使用しても、ファイルの末尾を取得するのではなく、変な動きをしてしまいます。 何か別の方法をご存知でしたら教えて頂けますでしょうか。 <前提> 1. ファイルの大きさは、都度変わりうる(min: 0, max: 数十GB) 2. NTFS上に、2GB超のファイルを既に書けていて、wc などの、単純にファイルを先頭から操作するコマンドは機能している。 3. SFUのkshを使用している。(他処理と連携したシステムの一部として作りたいので、パイプ・リダイレクト等で繋いで手操作はゼロにしたい) <既に試してダメだった方法> tail -c n ... 先頭からファイルを参照しているような動きをする tail +c ファイルサイズ-n ... 'Could not seek to byte -2139091255n file 'とエラーになる dd ... seek=n ... tail + と同様に、seekが失敗したとのエラー表示をし、エラーになる Perlでseekシステムコール システムコールが失敗する。 よろしくお願いします。

  • Androidアプリ開発・サンプルコードが開けない

    Androidアプリ開発は全くの初心者です。 パソコンでアンドロイドの開発環境の設定まではなんとか出来ました。 JAVA、eclipse、AndroidSDKのインストールまでも問題なく出来たと思うのですが、 いざSDKの中に入っているサンプルを開こうとするとエラーが出てシュミレーターでみれません。 ただ開けてシュミレーターで見れるサンプルもあるのです。 何がダメなのか全く分かりません。 どうかアンドロイドに詳しい方お教えください。 よろしくお願いします。

  • Java・ファイルへの書き込み

    はじめまして。 下記のプログラムで、以下の3つがどのような関係なのかがわかりません。 ("test1.txt")とnew FileWriterの関係 (new FileWriter("test1.txt")とnew BufferedWriterの関係 (new BufferedWriter(new FileWriter("test1.txt")と new PrintWriterの関係 どうかご教示いただきたく、よろしくお願い致します。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Sample7 { public static void main(String[] args){ PrintWriter pw = null; try{ pw = new PrintWriter (new BufferedWriter(new FileWriter("test1.txt"))); pw.println("Hello!"); pw.println("GoodBye"); System.out.println("ファイルに書き込みました。"); }catch(IOException e){ System.out.println("入出力エラーです。"); }finally{ if(pw != null){ pw.close(); } } } }

    • ベストアンサー
    • Java
着床症状、妊娠初期症状は⁉️
このQ&Aのポイント
  • 妊娠した方に質問です!着床時には出血があるのでしょうか?また、おりものの増加や熱、腰痛などの症状はありましたか?
  • 着床痛や症状はなく、生理が来ないまま妊娠が分かることもあるのでしょうか?
  • 着床症状や妊娠初期症状について教えてください。
回答を見る