• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:なぜプロセスはファイルにアクセスできません。)

プロセスがファイルにアクセスできない理由

このQ&Aのポイント
  • RandomAccessFileを使用してファイルにアクセスすると、プロセスはファイルにアクセスできないエラーが発生することがあります。
  • エラーコードの発生位置は実行ごとに異なります。約100万件のレコードがあるindex.dbファイルです。
  • Windows server 2008 R2の環境ではエラーが発生し、Intel Xeon CPUの24コアが原因と考えられます。モードの変更により正常に動作しました。

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

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

複数同時に実行、もしくはファイルを使用していませんか? ウィンドウズでは、書き込み可能なモードで開くとロックしてしまいます。 読み込みだけで良いなら、ロックしない分rだけにした方が早いはずです。

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

関連するQ&A

  • バイナリファイルでOutOfMemoryエラー

    お世話になります。 ブラウザ画面からファイルをアップロードし、そのバイナリデータを返すメソッドを作成したのですが、約50MB以上のファイルを使用するとOutOfMemoryエラーとなりJava heap spaceが足りないといわれてしまいます。ヒープサイズをあげればエラーはしなくなるとはおもいますが、根本的な解決にはならないと思います。 public byte[] upload(FormFile ff) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream is = ff.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); byte[] byteData; try { int data = 0; byte[] buffer = new byte[1024]; while ((data = bis.read(buffer) != -1) { baos.write(buffer, 0, data); } byteData = baos.toByteArray(); } catch (IOException e) { throw e; } finally { if (null != bis) { bis.close(); } } return byteData; } 以上のようなメソッドなのですが、おかしい点はありますでしょうか。 指摘していただけると助かります。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • byte配列→float型の値を読みlongに変換

    UTF-8 encodingで書かれたテキスト分とfloat型 (IEEE-754/octet-stream)で書かれたバイナリ分混ざったファイルがあります。そのファイルをdataInputStreamを使って読んで、byte配列に保存されています。 FileInputStream fis = new FileInputStream(ファイル); DataInputStream dis = new DataInputStream(fis); byte[] bs = new byte[適切なサイズ]; //読み込み dis.read(bs); byte配列「bs」のindex 0 から 5までテキスト情報(XML式のヘッダー情報)あると仮定します。 UTF-8の分は for loop で "new String(bs, loop index, 1, "ASCII")"すると読み取れます。 問題は以下: index 6 から 17まではfloat型のバイナリデータ保存されているとします。 たとえば、index 6 から 順番に以下のHex string があります。 01 2A 5F 4E   B4 F2 45 4E   92 6A 5F 4E (4つのグループにしたのは分かりやすくするため) 上記float型のHex String をlong intに変換して、別途用意された配列に保存したい。 ネット検索でByteBufferにwrapメソッドを使って、getFloat(index) 又は getFloat()でfloat型取得できると書いていますがその先はどうやってlong int変換できるのでしょうか? 上記のHex string の変換後の値(取扱いしたい値)は19554126, 3035776334, 2456444750です。 今までのコード: long [] data = new long [既知のサイズ]; ByteBuffer b = ByteBuffer.wrap(bs).order(ByteOrder.LITTLE_ENDIAN); //なんらかのloop 又は ByteBuffer b の最後まで読める仕組み(remainingというメソッド?){ Float f = b.getFloat(); 又は Float f = b.getFloat(loop index); data[index] = fの longに変換した値 // つまり 19554126, 3035776334 .... } ネットで探していますが、やり方まだわからない。 どなたか、教えてください。 よろしくお願いします。

  • 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 以上、宜しくお願い致します。

  • java でソケット通信をするとき

    javaでソケット通信をするとき、 //データ受け取り byte[] buffer = new byte[2048]; try { int size = 0; while (size <= 0) { size = is.read(buffer); } receiveStr = new String(buffer, 0,size, "UTF8"); } catch (IOException e) { e.printStackTrace(); } のようにしていますが、これだと文字数にして一度におくれる容量はどのくらいでしょうか? また、それらを増やすにはどうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • sqliteへのデータ追加

    sql文で質問です。接続は1-29の表示を確認済み。 掲示板を作る練習をしているのですが、とりあえずpostなどのユーザーから受け取り値をdbに保存・表示する前に、自分で保存(カラムは左から順にid,name,sexになっていてidの1~29は埋まっている状態です。)・表示してみようと思いtest.dbのhumanテーブルに「データの追加」と表記している部分をテーブルに書き込み表示したいのですが、エラーは表示されないもののid30番にデータの追加ができておらず困っています。 データを追加する方法を教えてください。 <?php // 変数の初期化 $db = null; $sql = null; $res = null; $row = null; $db = new SQLite3("test.db"); // データの追加 $sql = 'INSERT INTO human( id, name, sex, ) VALUES ( 30, "吉川", "男", )'; // データの取得 $sql = 'SELECT * FROM human WHERE id BETWEEN 1 AND 50;'; $res = $db->query($sql); while( $row = $res->fetchArray() ) { echo '<ul>'.'<li>'. $row[0] . $row[1] .$row[2].'<li>'.'<ul>';} ?>

  • バイナリ読み込みについて

    お世話になります。バイナリファイルの読み込みについて質問させてください。 バイナリファイルはC#で出力したものでushort型(符号無し16bit)で書き込んでいます。 //C#でushort型データのバイナリ書き込み例 private static void WriteBinary(){  ushort data=5000;   BinaryWriter bw = new BinaryWriter(new FileStream(@"C:\Binary.txt", FileMode.Create, FileAccess.Write)); bw.Write(data); bw.Close(); } これをJavaで読んで、書き込んだ値5000を取得したいのですが、 C#のushortは符号無しの2Byteなんので、Javaでそれに相当するように readUnsignedShortで読み込んだのですがうまくいきません。どなたかご教授ください。 //Javaでushort型データのバイナリ読み込み private static void ReadBinary(){  DataInputStream dis = new DataInputStream(new FileInputStream("C:\\Binary.txt"));  int data = dis.readUnsignedShort();  System.out.println(data);  } すると「34835」と表示されます。その他、readShort()→-30701 read(byte[2])として byteに格納してbyte[0]と[1]を足しても-101になり取得できませんでした。 保存されたデータは符号なしの16ビットなのでreadUnsignedShort()で取得できると 思ったのですが、何か根本的に考え方が違うのでしょうか?? ※もちろんC#でReadInt16で読み取ると正常に5000を取得できした。

    • ベストアンサー
    • Java
  • Strutsによるバイナリファイル出力

    FileInputStream stream =new FileInputStream("C:/Test.exe"); String filename = "Test1.exe"; int bytesRead = 0; byte[] buffer = new byte[256]; HttpResponse.setContentType("application/octet-stream; charset=UTF-8"); HttpResponse.setHeader("Content-Disposition","attachment; filename=\""+filename+"\""); ServletOutputStream sos =HttpResponse.getOutputStream(); while ((bytesRead = stream.read(buffer,0,256) != -1) {  sos.write(buffer); } sos.flush(); sos.close(); stream.close(); 以上のコードでローカル内にあるファイルを名前を変え転送していますが クライアントにより正常なファイルだったり異常なファイルだったりします。 異常なファイルはクライアントによりばらばらですが、ファイルサイズが正常のものより少し大きかったりします。 バッファーではなくバイト単位での転送も試みたのですが 結果は同じでした。 何かおかしい点ありましたらご指摘いただけますでしょうか。

    • ベストアンサー
    • Java
  • Javaアプレットによる、ファイルへのランダムアクセス方法

    Java初心者です。Javaアプレットによる、ファイルへのランダムアクセスのコーディング方法について教えて下さい。 現在スタンドアロンで以下の様なコードでランダムアクセスを実現しました。  fr = new RandomAccessFile(url,"r");   ・   ・  //ファイルポインタの格納  w_pointer = fr.getFilePointer();  w_data = new String(fr.readLine().getBytes("8859_1"));  w_address[i] = w_pointer;  //格納したアドレスからrec_num番目のレコードを取得する  fr.seek(w_address[rec_num-1]);  rec_data = new String(fr.readLine().getBytes("8859_1")); しかし、Webサーバで公開したい場合のファイルへのランダムアクセス方法がわかりません。(サーバ上のファイルへのアクセス) webで調べたところ、シーケンシャルアクセスの場合には、ストリームによるアクセスで可能とのことですがランダムアクセスには使えないと書いてありました。 どなたか解決方法をご存じの方、宜しくお願い致します。

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

    phpのfor文だと思うのですが、エラー(そもそも表示されない)ので教えてください。 sqlでデータを取得し 今まで下記のようにしていましたが、10こ表示したいです。 a タグの中身についても変化させたくて、  ループ1回目はa href="1.php" ループ2回目はa href="2.php" ループ3回目はa href="3.php" いこう10まで (ファイル名は通し番号になっていて、1~10.phpになっています。) phpのプログラムは <?php // 変数の初期化 $db = null; $sql = null; $res = null; $row = null; $db = new SQLite3("test.db"); // データの取得 $sql = 'SELECT * FROM human where country="japan"'; $res = $db->query($sql); <?php while( $row = $res->fetchArray() )(これ10回ループさせたいを) { echo '<ul>' . '<a href="ここを変化させたい。" target=_brank>'. '<li>' . $row[0] . '<span>' , $row[1].'<span>', $row[2].'<span>',$row[3].'<span>', $row[4]. '<span>', $row[5].'<span>' , '<img src="$row[6]">'.'<span>' . '</li>'. '</a>' . '</ul>'; } よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • パイプでバイト転送

    パイプを使ってデータの受け渡しをしているのですが、うまくいきません。 書き込むほうでは、はじめ4バイトにデータサイズを。後にデータを書き込みます。 読み込むほうでは、はじめ4バイトを読み込んでデータサイズを。後はデータサイズ分を読み込む。 以下のソースで、どこかいけないところはありますか? #コメントのところは省略している部分です。 #コメントの処理を行っています。 ---ここから--- Pipe pipe; SourceChannel sourceChannel = pipe.source(); sourceChannel.configureBlocking(false); SinkChannel sinkChannel = pipe.sink(); byte[] b = new byte[4]; b[0] = (byte)((msg >>> 24) & 0xFF); b[1] = (byte)((msg >>> 16) & 0xFF); b[2] = (byte)((msg >>> 8) & 0xFF); b[3] = (byte)((msg >>> 0) & 0xFF); // bの後ろに転送文字列を結合 b += "hogehogehoge".getBytes(); // 書き込み専用チャネルからストリームを作成 OutputStream out = getOutputStream(sinkChannel); // 入力専用チャネルからストリームを作成 DataInputStream in = new DataInputStream(getInputStream(sourceChannel)); int size = (int)in.readInt(); byte[] buf = new byte[size]; int len = in.read(buf, 0, size); ---ここまで--- 実行結果、チャネルでEOF例外が発生しました。 java.io.EOFException at java.io.DataInputStream.readInt(Unknown Source) at jp.okwave.search.community.process.UpdateDataTransferThread.readAction(UpdateDataTransferThread.java:255) at jp.okwave.search.community.communicate.thread.ClientThread.run(ClientThread.java:241) at java.lang.Thread.run(Unknown Source) なぜでしょうか。。 よろしくお願いします。