Android: Write string to file





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







1















i tried to write a string to a specific file but it wont work.
I tried it with this part of code down here but it isn't writing anything in my .txt file



private void writeToFile(String data) {
try {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(Environment.getExternalStorageDirectory()+ "/config/url.txt", Context.MODE_PRIVATE));
outputStreamWriter.write(data);
outputStreamWriter.close();
}
catch (IOException e) {
Log.e("Exception", "File write failed: " + e.toString());
}
}


I don't know why this isn't working, it would be great to receive some help.










share|improve this question





























    1















    i tried to write a string to a specific file but it wont work.
    I tried it with this part of code down here but it isn't writing anything in my .txt file



    private void writeToFile(String data) {
    try {
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(Environment.getExternalStorageDirectory()+ "/config/url.txt", Context.MODE_PRIVATE));
    outputStreamWriter.write(data);
    outputStreamWriter.close();
    }
    catch (IOException e) {
    Log.e("Exception", "File write failed: " + e.toString());
    }
    }


    I don't know why this isn't working, it would be great to receive some help.










    share|improve this question

























      1












      1








      1


      1






      i tried to write a string to a specific file but it wont work.
      I tried it with this part of code down here but it isn't writing anything in my .txt file



      private void writeToFile(String data) {
      try {
      OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(Environment.getExternalStorageDirectory()+ "/config/url.txt", Context.MODE_PRIVATE));
      outputStreamWriter.write(data);
      outputStreamWriter.close();
      }
      catch (IOException e) {
      Log.e("Exception", "File write failed: " + e.toString());
      }
      }


      I don't know why this isn't working, it would be great to receive some help.










      share|improve this question














      i tried to write a string to a specific file but it wont work.
      I tried it with this part of code down here but it isn't writing anything in my .txt file



      private void writeToFile(String data) {
      try {
      OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput(Environment.getExternalStorageDirectory()+ "/config/url.txt", Context.MODE_PRIVATE));
      outputStreamWriter.write(data);
      outputStreamWriter.close();
      }
      catch (IOException e) {
      Log.e("Exception", "File write failed: " + e.toString());
      }
      }


      I don't know why this isn't working, it would be great to receive some help.







      android file outputstream






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Mar 9 '14 at 17:10









      EinsteinEinstein

      135213




      135213
























          3 Answers
          3






          active

          oldest

          votes


















          3














          OpenFileOutput accepts a filename without separators, as written below



          Context | Android Developers



          So it would be



          Writer writer = null;
          try {
          writer = new OutputStreamWriter(openFileOutput("url.txt", Context.MODE_PRIVATE));
          writer.write(data);
          } catch (IOException e) {
          e.printStackTrace();
          } finally {
          if (writer != null) writer.close();
          }


          For a private directory.
          Note that there is no such thing as private mode on an external storage.



          It is a bad idea to store configuration files on external storage, because




          • The file messes folder structure

          • The file will not be deleted with the app nor cleared with data

          • The file can be deleted by user or removed if the external storage is removable

          • The file can be easily accessed and violated by a user.


          So what you probably need is what I've said above, but if you really need to write there, the proper way is listed below



          Also I don't like hardcoding separators.
          Also, if you need a file on an external storage, proper way of creating a File object is



          Writer writer = null;
          try {
          // get config dir
          final File configDir = new File(Environment.getExternalStorageDirectory(), "config");
          //make sure it's created
          configDir.mkdir();
          // open a stream
          writer = new OutputStreamWriter(new FileOutputStream(new File(configDir, "url.txt")));
          writer.write(data);
          } catch (IOException e) {
          e.printStackTrace();
          } finally {
          if (writer != null) writer.close();
          }





          share|improve this answer


























          • You code is right, but block finally is not call in same case

            – a.black13
            Mar 9 '14 at 17:43













          • @SciJoker In what case? fInally is always called whenever first line in try was was called. The only case when it's not called is a crash.

            – Yaroslav Mytkalyk
            Mar 9 '14 at 17:48













          • Because a finally block will always be called unless you call System.exit() (or the thread crashes).

            – a.black13
            Mar 9 '14 at 17:50













          • Thank you very much Doctoror Drive! This worked for me! I've done this, because on my phone the main folder is the external folder.

            – Einstein
            Mar 9 '14 at 17:53











          • @SciJoker never tried this, but calling System.exit() is a bad idea anyway. Especially in a try block.

            – Yaroslav Mytkalyk
            Mar 9 '14 at 17:55



















          0














          Try that:



          private void writeToFile(String data) {
          try {

          File dir = new File(Environment.getExternalStorageDirectory().getPath() + "/config/");

          if (dir.exists()) {
          // do nothing folder already exists
          } else {
          // make file folder
          dir.mkdirs();
          }

          File statText = new File(Environment.getExternalStorageDirectory()+ "/config/url.txt");
          FileOutputStream is = new FileOutputStream(statText);
          OutputStreamWriter osw = new OutputStreamWriter(is);
          Writer w = new BufferedWriter(osw);
          w.write(data);
          w.close();
          }
          catch (IOException e) {
          Log.e("Exception", "File write failed: " + e.toString());
          }
          }





          share|improve this answer





















          • 1





            You've forgot to make sure the config dir is created. This can fail. Also you haven't closed the streams.

            – Yaroslav Mytkalyk
            Mar 9 '14 at 17:28






          • 1





            After wrote data to file U must close streams connections

            – a.black13
            Mar 9 '14 at 17:41











          • Now everyone should be happy :P

            – ottse
            Mar 9 '14 at 18:16



















          0














          For this case, especially on Android, the way going for bytes is usually faster.



          With this, I solved it by setting up a class which is given the responsibility to deal with reading/writing bytes from/to file through stream.



          As far as it's knew generally, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset) can help us to transfer string you want to bytes you need.



          To use FileHelper, run as below: FileHelper.getInstance().writeStringToFile(FileHelper.getInstance().createInternalFile("dir_name", "file_name.txt", context), "a string going to be written to /dir_name/file_name.txt", null);



          public class FileHelper {
          private static final String DEFAULT_DIR_NAME = "AmoFromTaiwan";
          private static final int DEFAULT_BUFFER_SIZE = 1024;
          private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
          private static final int EOF = -1;
          private static FileHelper INSTANCE = new FileHelper();

          public static FileHelper getInstance() {
          return INSTANCE;
          }

          private boolean isExternalStorageWritable(Context context) {
          /*
          String state = Environment.getExternalStorageState();
          return Environment.MEDIA_MOUNTED.equals(state);
          */
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
          if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
          return true;
          } else {
          Logger.e("!!! checkSelfPermission() not granted");
          return false;
          }
          } else { //permission is automatically granted on sdk<23 upon installation
          return true;
          }
          }

          private boolean isExternalStorageReadable(Context context) {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
          if (context.checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
          return true;
          } else {
          Logger.e("!!! checkSelfPermission() not granted");
          return false;
          }
          } else { //permission is automatically granted on sdk<23 upon installation
          return true;
          }
          }

          @SuppressLint("SimpleDateFormat")
          private String generateFileNameBasedOnTimeStamp() {
          return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
          }

          public File createExternalFile(String dir_name, String file_name, Context context) {
          String dir_path;
          String file_path;
          File dir ;
          File file;
          if (!isExternalStorageWritable(context)) {
          Logger.e("!!! external storage not writable");
          return null;
          }
          if (dir_name == null) {
          dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
          } else {
          dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
          }
          Logger.d("... going to access an external dir:" + dir_path);
          dir = new File(dir_path);
          if (!dir.exists()) {
          Logger.d("... going to mkdirs:" + dir_path);
          if (!dir.mkdirs()) {
          Logger.e("!!! failed to mkdirs");
          return null;
          }
          }
          if (file_name == null) {
          file_path = dir_path + File.separator + generateFileNameBasedOnTimeStamp();
          } else {
          file_path = dir_path + File.separator + file_name;
          }
          Logger.d("... going to return an external dir:" + file_path);
          file = new File(file_path);
          if (file.exists()) {
          Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
          if (!file.delete()) {
          Logger.e("!!! failed to delete file");
          return null;
          }
          }
          return file;
          }

          public File createInternalFile(String dir_name, String file_name, Context context) {
          String dir_path;
          String file_path;
          File dir ;
          File file;
          if (dir_name == null) {
          dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
          } else {
          dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
          }
          dir_path = dir.getAbsolutePath();
          Logger.d("... going to access an internal dir:" + dir_path);
          if (!dir.exists()) {
          Logger.d("... going to mkdirs:" + dir_path);
          if (!dir.mkdirs()) {
          Logger.e("!!! mkdirs failed");
          return null;
          }
          }
          if (file_name == null) {
          file = new File(dir, generateFileNameBasedOnTimeStamp());
          } else {
          file = new File(dir, file_name);
          }
          file_path = file.getAbsolutePath();
          Logger.d("... going to return an internal dir:" + file_path);
          if (file.exists()) {
          Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
          if (!file.delete()) {
          Logger.e("!!! failed to delete file");
          return null;
          }
          }
          return file;
          }

          public File getExternalFile(String dir_name, String file_name, Context context) {
          String dir_path;
          String file_path;
          File file;
          if (!isExternalStorageWritable(context)) {
          Logger.e("!!! external storage not writable");
          return null;
          }
          if (dir_name == null) {
          dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
          } else {
          dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
          }
          if (file_name == null) {
          file_path = dir_path;
          } else {
          file_path = dir_path + File.separator + file_name;
          }
          Logger.d("... going to return an external file:" + file_path);
          file = new File(file_path);
          if (file.exists()) {
          Logger.d("... file exists:" + file.getAbsolutePath());
          } else {
          Logger.e("!!! file does't exist:" + file.getAbsolutePath());
          }
          return file;
          }

          public File getInternalFile(String dir_name, String file_name, Context context) {
          String file_path;
          File dir ;
          File file;
          if (dir_name == null) {
          dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
          } else {
          dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
          }
          if (file_name == null) {
          file = new File(dir.getAbsolutePath());
          } else {
          file = new File(dir, file_name);
          }
          file_path = file.getAbsolutePath();
          Logger.d("... going to return an internal dir:" + file_path);
          if (file.exists()) {
          Logger.d("... file exists:" + file.getAbsolutePath());
          } else {
          Logger.e("!!! file does't exist:" + file.getAbsolutePath());
          }
          return file;
          }

          private byte readBytesFromFile(File file) {
          Logger.d(">>> path:" + file.getAbsolutePath());
          FileInputStream fis;
          long file_length;
          byte buffer;
          int offset = 0;
          int next = 0;
          if (!file.exists()) {
          Logger.e("!!! file doesn't exists");
          return null;
          }
          if (file.length() > Integer.MAX_VALUE) {
          Logger.e("!!! file length is out of max of int");
          return null;
          } else {
          file_length = file.length();
          }
          try {
          fis = new FileInputStream(file);
          //buffer = new byte[(int) file_length];
          buffer = new byte[(int) file.length()];
          long time_start = System.currentTimeMillis();
          while (true) {
          Logger.d("... now next:" + next + " and offset:" + offset);
          if (System.currentTimeMillis() - time_start > 1000) {
          Logger.e("!!! left due to time out");
          break;
          }
          next = fis.read(buffer, offset, (buffer.length-offset));
          if (next < 0 || offset >= buffer.length) {
          Logger.d("... completed to read");
          break;
          }
          offset += next;
          }
          //if (offset < buffer.length) {
          if (offset < (int) file_length) {
          Logger.e("!!! not complete to read");
          return null;
          }
          fis.close();
          return buffer;
          } catch (IOException e) {
          e.printStackTrace();
          Logger.e("!!! IOException");
          return null;
          }
          }

          public byte readBytesFromFile(File file, boolean is_fis_fos_only) {
          if (file == null) return null;
          if (is_fis_fos_only) {
          return readBytesFromFile(file);
          }
          Logger.d(">>> path:" + file.getAbsolutePath());
          FileInputStream fis;
          BufferedInputStream bis;
          ByteArrayOutputStream bos;
          byte buf = new byte[(int) file.length()];
          int num_read;
          if (!file.exists()) {
          Logger.e("!!! file doesn't exists");
          return null;
          }
          try {
          fis = new FileInputStream(file);
          bis = new BufferedInputStream(fis);
          bos = new ByteArrayOutputStream();
          long time_start = System.currentTimeMillis();
          while (true) {
          if (System.currentTimeMillis() - time_start > 1000) {
          Logger.e("!!! left due to time out");
          break;
          }
          num_read = bis.read(buf, 0, buf.length); //1024 bytes per call
          if (num_read < 0) break;
          bos.write(buf, 0, num_read);
          }
          buf = bos.toByteArray();
          fis.close();
          bis.close();
          bos.close();
          return buf;
          } catch (FileNotFoundException e) {
          e.printStackTrace();
          Logger.e("!!! FileNotFoundException");
          return null;
          } catch (IOException e) {
          e.printStackTrace();
          Logger.e("!!! IOException");
          return null;
          }
          }

          /**
          * streams (InputStream and OutputStream) transfer binary data
          * if to write a string to a stream, must first convert it to bytes, or in other words encode it
          */
          public boolean writeStringToFile(File file, String string, Charset charset) {
          if (file == null) return false;
          if (string == null) return false;
          return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
          }

          public boolean writeBytesToFile(File file, byte data) {
          if (file == null) return false;
          if (data == null) return false;
          FileOutputStream fos;
          BufferedOutputStream bos;
          try {
          fos = new FileOutputStream(file);
          bos = new BufferedOutputStream(fos);
          bos.write(data, 0, data.length);
          bos.flush();
          bos.close();
          fos.close();
          } catch (IOException e) {
          e.printStackTrace();
          Logger.e("!!! IOException");
          return false;
          }
          return true;
          }

          /**
          * io blocks until some input/output is available.
          */
          public boolean copy(File source, File destination) {
          if (source == null || destination == null) return false;
          Logger.d(">>> source:" + source.getAbsolutePath() + ", destination:" + destination.getAbsolutePath());
          try {
          FileInputStream fis = new FileInputStream(source);
          FileOutputStream fos = new FileOutputStream(destination);
          byte buffer = new byte[(int) source.length()];
          int len;
          while (EOF != (len = fis.read(buffer))) {
          fos.write(buffer, 0, len);
          }
          if (true) { //debug
          byte copies = readBytesFromFile(destination);
          if (copies != null) {
          int copy_len = copies.length;
          Logger.d("... stream read and write done for " + copy_len + " bytes");
          }
          }
          return destination.length() != 0;
          } catch (IOException e) {
          e.printStackTrace();
          return false;
          }
          }

          public void list(final String path, final String end, final List<File> files) {
          Logger.d(">>> path:" + path + ", end:" + end);
          File file = new File(path);
          if (file.isDirectory()) {
          for (File child : file.listFiles()){
          list(child.getAbsolutePath(), end, files);
          }
          } else if (file.isFile()) {
          if (end.equals("")) {
          files.add(file);
          } else {
          if (file.getName().endsWith(end)) files.add(file);
          }
          }
          }

          public String splitFileName(File file, String split) {
          String path;
          String ext;
          int lastIndexOfSplit = file.getAbsolutePath().lastIndexOf(split);
          if (lastIndexOfSplit < 0) {
          path = file.getAbsolutePath();
          ext = "";
          } else {
          path = file.getAbsolutePath().substring(0, lastIndexOfSplit);
          ext = file.getAbsolutePath().substring(lastIndexOfSplit);
          }
          return new String {path, ext};
          }

          public File rename(File old_file, String new_name) {
          if (old_file == null || new_name == null) return null;
          Logger.d(">>> old file path:" + old_file.getAbsolutePath() + ", new file name:" + new_name);
          File new_file = new File(old_file, new_name);
          if (!old_file.equals(new_file)) {
          if (new_file.exists()) { //if find out previous file/dir at new path name exists
          if (new_file.delete()) {
          Logger.d("... succeeded to delete previous file at new abstract path name:" + new_file.getAbsolutePath());
          } else {
          Logger.e("!!! failed to delete previous file at new abstract path name");
          return null;
          }
          }
          if (old_file.renameTo(new_file)) {
          Logger.d("... succeeded to rename old file to new abstract path name:" + new_file.getAbsolutePath());
          } else {
          Logger.e("!!! failed to rename old file to new abstract path name");
          }
          } else {
          Logger.d("... new and old file have the equal abstract path name:" + new_file.getAbsolutePath());
          }
          return new_file;
          }

          public boolean remove(final String path, final String end) {
          Logger.d(">>> path:" + path + ", end:" + end);
          File file = new File(path);
          boolean result = false;
          if (file.isDirectory()) {
          for (File child : file.listFiles()){
          result = remove(child.getAbsolutePath(), end);
          }
          } else if (file.isFile()) {
          if (end.equals("")) {
          result = file.delete();
          } else {
          if (file.getName().endsWith(end)) result = file.delete();
          }
          } else {
          Logger.e("!!! child is not file or directory");
          }
          return result;
          }

          @TargetApi(Build.VERSION_CODES.O)
          public byte readNIOBytesFromFile(String path) throws IOException {
          Logger.d(">>> path:" + path);
          if (!Files.exists(Paths.get(path), LinkOption.NOFOLLOW_LINKS)) {
          Logger.e("!!! file doesn't exists");
          return null;
          } else {
          return Files.readAllBytes(Paths.get(path));
          }
          }

          @TargetApi(Build.VERSION_CODES.O)
          public File writeNIOBytesToFile(String dir, String name, byte data) {
          Logger.d(">>> dir:" + dir + ", name:" + name);
          Path path_dir;
          Path path_file;
          try {
          if (!Files.exists(Paths.get(dir), LinkOption.NOFOLLOW_LINKS)) {
          Logger.d("... make a dir");
          path_dir = Files.createDirectories(Paths.get(dir));
          if (path_dir == null) {
          Logger.e("!!! failed to make a dir");
          return null;
          }
          }
          path_file = Files.write(Paths.get(name), data);
          return path_file.toFile();
          } catch (IOException e) {
          e.printStackTrace();
          Logger.e("!!! IOException");
          return null;
          }
          }

          @TargetApi(Build.VERSION_CODES.O)
          public void listNIO(final String dir, final String end, final List<File> files) throws IOException {
          Logger.d(">>> dir:" + dir + ", end:" + end);
          Files.walkFileTree(Paths.get(dir), new FileVisitor<Path>() {
          @Override
          public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
          Logger.d("... file:" + dir.getFileName());
          return FileVisitResult.CONTINUE;
          }

          @Override
          public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
          Logger.d("... file:" + file.getFileName());
          if (end.equals("")) {
          files.add(file.toFile());
          } else {
          if (file.endsWith(end)) files.add(file.toFile());
          }
          return FileVisitResult.CONTINUE;
          }

          @Override
          public FileVisitResult visitFileFailed(Path file, IOException exc) {
          Logger.d("... file:" + file.getFileName());
          if (end.equals("")) {
          files.add(file.toFile());
          } else {
          if (file.endsWith(end)) files.add(file.toFile());
          }
          return FileVisitResult.CONTINUE;
          }

          @Override
          public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
          Logger.d("... file:" + dir.getFileName());
          return FileVisitResult.CONTINUE;
          }
          });
          }

          /**
          * recursion
          */
          private int factorial (int x) {
          if (x > 1) return (x*(factorial(x-1)));
          else if (x == 1) return x;
          else return 0;
          }


          }






          share|improve this answer


























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f22285255%2fandroid-write-string-to-file%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            3 Answers
            3






            active

            oldest

            votes








            3 Answers
            3






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            3














            OpenFileOutput accepts a filename without separators, as written below



            Context | Android Developers



            So it would be



            Writer writer = null;
            try {
            writer = new OutputStreamWriter(openFileOutput("url.txt", Context.MODE_PRIVATE));
            writer.write(data);
            } catch (IOException e) {
            e.printStackTrace();
            } finally {
            if (writer != null) writer.close();
            }


            For a private directory.
            Note that there is no such thing as private mode on an external storage.



            It is a bad idea to store configuration files on external storage, because




            • The file messes folder structure

            • The file will not be deleted with the app nor cleared with data

            • The file can be deleted by user or removed if the external storage is removable

            • The file can be easily accessed and violated by a user.


            So what you probably need is what I've said above, but if you really need to write there, the proper way is listed below



            Also I don't like hardcoding separators.
            Also, if you need a file on an external storage, proper way of creating a File object is



            Writer writer = null;
            try {
            // get config dir
            final File configDir = new File(Environment.getExternalStorageDirectory(), "config");
            //make sure it's created
            configDir.mkdir();
            // open a stream
            writer = new OutputStreamWriter(new FileOutputStream(new File(configDir, "url.txt")));
            writer.write(data);
            } catch (IOException e) {
            e.printStackTrace();
            } finally {
            if (writer != null) writer.close();
            }





            share|improve this answer


























            • You code is right, but block finally is not call in same case

              – a.black13
              Mar 9 '14 at 17:43













            • @SciJoker In what case? fInally is always called whenever first line in try was was called. The only case when it's not called is a crash.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:48













            • Because a finally block will always be called unless you call System.exit() (or the thread crashes).

              – a.black13
              Mar 9 '14 at 17:50













            • Thank you very much Doctoror Drive! This worked for me! I've done this, because on my phone the main folder is the external folder.

              – Einstein
              Mar 9 '14 at 17:53











            • @SciJoker never tried this, but calling System.exit() is a bad idea anyway. Especially in a try block.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:55
















            3














            OpenFileOutput accepts a filename without separators, as written below



            Context | Android Developers



            So it would be



            Writer writer = null;
            try {
            writer = new OutputStreamWriter(openFileOutput("url.txt", Context.MODE_PRIVATE));
            writer.write(data);
            } catch (IOException e) {
            e.printStackTrace();
            } finally {
            if (writer != null) writer.close();
            }


            For a private directory.
            Note that there is no such thing as private mode on an external storage.



            It is a bad idea to store configuration files on external storage, because




            • The file messes folder structure

            • The file will not be deleted with the app nor cleared with data

            • The file can be deleted by user or removed if the external storage is removable

            • The file can be easily accessed and violated by a user.


            So what you probably need is what I've said above, but if you really need to write there, the proper way is listed below



            Also I don't like hardcoding separators.
            Also, if you need a file on an external storage, proper way of creating a File object is



            Writer writer = null;
            try {
            // get config dir
            final File configDir = new File(Environment.getExternalStorageDirectory(), "config");
            //make sure it's created
            configDir.mkdir();
            // open a stream
            writer = new OutputStreamWriter(new FileOutputStream(new File(configDir, "url.txt")));
            writer.write(data);
            } catch (IOException e) {
            e.printStackTrace();
            } finally {
            if (writer != null) writer.close();
            }





            share|improve this answer


























            • You code is right, but block finally is not call in same case

              – a.black13
              Mar 9 '14 at 17:43













            • @SciJoker In what case? fInally is always called whenever first line in try was was called. The only case when it's not called is a crash.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:48













            • Because a finally block will always be called unless you call System.exit() (or the thread crashes).

              – a.black13
              Mar 9 '14 at 17:50













            • Thank you very much Doctoror Drive! This worked for me! I've done this, because on my phone the main folder is the external folder.

              – Einstein
              Mar 9 '14 at 17:53











            • @SciJoker never tried this, but calling System.exit() is a bad idea anyway. Especially in a try block.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:55














            3












            3








            3







            OpenFileOutput accepts a filename without separators, as written below



            Context | Android Developers



            So it would be



            Writer writer = null;
            try {
            writer = new OutputStreamWriter(openFileOutput("url.txt", Context.MODE_PRIVATE));
            writer.write(data);
            } catch (IOException e) {
            e.printStackTrace();
            } finally {
            if (writer != null) writer.close();
            }


            For a private directory.
            Note that there is no such thing as private mode on an external storage.



            It is a bad idea to store configuration files on external storage, because




            • The file messes folder structure

            • The file will not be deleted with the app nor cleared with data

            • The file can be deleted by user or removed if the external storage is removable

            • The file can be easily accessed and violated by a user.


            So what you probably need is what I've said above, but if you really need to write there, the proper way is listed below



            Also I don't like hardcoding separators.
            Also, if you need a file on an external storage, proper way of creating a File object is



            Writer writer = null;
            try {
            // get config dir
            final File configDir = new File(Environment.getExternalStorageDirectory(), "config");
            //make sure it's created
            configDir.mkdir();
            // open a stream
            writer = new OutputStreamWriter(new FileOutputStream(new File(configDir, "url.txt")));
            writer.write(data);
            } catch (IOException e) {
            e.printStackTrace();
            } finally {
            if (writer != null) writer.close();
            }





            share|improve this answer















            OpenFileOutput accepts a filename without separators, as written below



            Context | Android Developers



            So it would be



            Writer writer = null;
            try {
            writer = new OutputStreamWriter(openFileOutput("url.txt", Context.MODE_PRIVATE));
            writer.write(data);
            } catch (IOException e) {
            e.printStackTrace();
            } finally {
            if (writer != null) writer.close();
            }


            For a private directory.
            Note that there is no such thing as private mode on an external storage.



            It is a bad idea to store configuration files on external storage, because




            • The file messes folder structure

            • The file will not be deleted with the app nor cleared with data

            • The file can be deleted by user or removed if the external storage is removable

            • The file can be easily accessed and violated by a user.


            So what you probably need is what I've said above, but if you really need to write there, the proper way is listed below



            Also I don't like hardcoding separators.
            Also, if you need a file on an external storage, proper way of creating a File object is



            Writer writer = null;
            try {
            // get config dir
            final File configDir = new File(Environment.getExternalStorageDirectory(), "config");
            //make sure it's created
            configDir.mkdir();
            // open a stream
            writer = new OutputStreamWriter(new FileOutputStream(new File(configDir, "url.txt")));
            writer.write(data);
            } catch (IOException e) {
            e.printStackTrace();
            } finally {
            if (writer != null) writer.close();
            }






            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Mar 9 '14 at 17:30

























            answered Mar 9 '14 at 17:15









            Yaroslav MytkalykYaroslav Mytkalyk

            14.6k96193




            14.6k96193













            • You code is right, but block finally is not call in same case

              – a.black13
              Mar 9 '14 at 17:43













            • @SciJoker In what case? fInally is always called whenever first line in try was was called. The only case when it's not called is a crash.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:48













            • Because a finally block will always be called unless you call System.exit() (or the thread crashes).

              – a.black13
              Mar 9 '14 at 17:50













            • Thank you very much Doctoror Drive! This worked for me! I've done this, because on my phone the main folder is the external folder.

              – Einstein
              Mar 9 '14 at 17:53











            • @SciJoker never tried this, but calling System.exit() is a bad idea anyway. Especially in a try block.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:55



















            • You code is right, but block finally is not call in same case

              – a.black13
              Mar 9 '14 at 17:43













            • @SciJoker In what case? fInally is always called whenever first line in try was was called. The only case when it's not called is a crash.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:48













            • Because a finally block will always be called unless you call System.exit() (or the thread crashes).

              – a.black13
              Mar 9 '14 at 17:50













            • Thank you very much Doctoror Drive! This worked for me! I've done this, because on my phone the main folder is the external folder.

              – Einstein
              Mar 9 '14 at 17:53











            • @SciJoker never tried this, but calling System.exit() is a bad idea anyway. Especially in a try block.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:55

















            You code is right, but block finally is not call in same case

            – a.black13
            Mar 9 '14 at 17:43







            You code is right, but block finally is not call in same case

            – a.black13
            Mar 9 '14 at 17:43















            @SciJoker In what case? fInally is always called whenever first line in try was was called. The only case when it's not called is a crash.

            – Yaroslav Mytkalyk
            Mar 9 '14 at 17:48







            @SciJoker In what case? fInally is always called whenever first line in try was was called. The only case when it's not called is a crash.

            – Yaroslav Mytkalyk
            Mar 9 '14 at 17:48















            Because a finally block will always be called unless you call System.exit() (or the thread crashes).

            – a.black13
            Mar 9 '14 at 17:50







            Because a finally block will always be called unless you call System.exit() (or the thread crashes).

            – a.black13
            Mar 9 '14 at 17:50















            Thank you very much Doctoror Drive! This worked for me! I've done this, because on my phone the main folder is the external folder.

            – Einstein
            Mar 9 '14 at 17:53





            Thank you very much Doctoror Drive! This worked for me! I've done this, because on my phone the main folder is the external folder.

            – Einstein
            Mar 9 '14 at 17:53













            @SciJoker never tried this, but calling System.exit() is a bad idea anyway. Especially in a try block.

            – Yaroslav Mytkalyk
            Mar 9 '14 at 17:55





            @SciJoker never tried this, but calling System.exit() is a bad idea anyway. Especially in a try block.

            – Yaroslav Mytkalyk
            Mar 9 '14 at 17:55













            0














            Try that:



            private void writeToFile(String data) {
            try {

            File dir = new File(Environment.getExternalStorageDirectory().getPath() + "/config/");

            if (dir.exists()) {
            // do nothing folder already exists
            } else {
            // make file folder
            dir.mkdirs();
            }

            File statText = new File(Environment.getExternalStorageDirectory()+ "/config/url.txt");
            FileOutputStream is = new FileOutputStream(statText);
            OutputStreamWriter osw = new OutputStreamWriter(is);
            Writer w = new BufferedWriter(osw);
            w.write(data);
            w.close();
            }
            catch (IOException e) {
            Log.e("Exception", "File write failed: " + e.toString());
            }
            }





            share|improve this answer





















            • 1





              You've forgot to make sure the config dir is created. This can fail. Also you haven't closed the streams.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:28






            • 1





              After wrote data to file U must close streams connections

              – a.black13
              Mar 9 '14 at 17:41











            • Now everyone should be happy :P

              – ottse
              Mar 9 '14 at 18:16
















            0














            Try that:



            private void writeToFile(String data) {
            try {

            File dir = new File(Environment.getExternalStorageDirectory().getPath() + "/config/");

            if (dir.exists()) {
            // do nothing folder already exists
            } else {
            // make file folder
            dir.mkdirs();
            }

            File statText = new File(Environment.getExternalStorageDirectory()+ "/config/url.txt");
            FileOutputStream is = new FileOutputStream(statText);
            OutputStreamWriter osw = new OutputStreamWriter(is);
            Writer w = new BufferedWriter(osw);
            w.write(data);
            w.close();
            }
            catch (IOException e) {
            Log.e("Exception", "File write failed: " + e.toString());
            }
            }





            share|improve this answer





















            • 1





              You've forgot to make sure the config dir is created. This can fail. Also you haven't closed the streams.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:28






            • 1





              After wrote data to file U must close streams connections

              – a.black13
              Mar 9 '14 at 17:41











            • Now everyone should be happy :P

              – ottse
              Mar 9 '14 at 18:16














            0












            0








            0







            Try that:



            private void writeToFile(String data) {
            try {

            File dir = new File(Environment.getExternalStorageDirectory().getPath() + "/config/");

            if (dir.exists()) {
            // do nothing folder already exists
            } else {
            // make file folder
            dir.mkdirs();
            }

            File statText = new File(Environment.getExternalStorageDirectory()+ "/config/url.txt");
            FileOutputStream is = new FileOutputStream(statText);
            OutputStreamWriter osw = new OutputStreamWriter(is);
            Writer w = new BufferedWriter(osw);
            w.write(data);
            w.close();
            }
            catch (IOException e) {
            Log.e("Exception", "File write failed: " + e.toString());
            }
            }





            share|improve this answer















            Try that:



            private void writeToFile(String data) {
            try {

            File dir = new File(Environment.getExternalStorageDirectory().getPath() + "/config/");

            if (dir.exists()) {
            // do nothing folder already exists
            } else {
            // make file folder
            dir.mkdirs();
            }

            File statText = new File(Environment.getExternalStorageDirectory()+ "/config/url.txt");
            FileOutputStream is = new FileOutputStream(statText);
            OutputStreamWriter osw = new OutputStreamWriter(is);
            Writer w = new BufferedWriter(osw);
            w.write(data);
            w.close();
            }
            catch (IOException e) {
            Log.e("Exception", "File write failed: " + e.toString());
            }
            }






            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Mar 9 '14 at 18:16

























            answered Mar 9 '14 at 17:13









            ottseottse

            49958




            49958








            • 1





              You've forgot to make sure the config dir is created. This can fail. Also you haven't closed the streams.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:28






            • 1





              After wrote data to file U must close streams connections

              – a.black13
              Mar 9 '14 at 17:41











            • Now everyone should be happy :P

              – ottse
              Mar 9 '14 at 18:16














            • 1





              You've forgot to make sure the config dir is created. This can fail. Also you haven't closed the streams.

              – Yaroslav Mytkalyk
              Mar 9 '14 at 17:28






            • 1





              After wrote data to file U must close streams connections

              – a.black13
              Mar 9 '14 at 17:41











            • Now everyone should be happy :P

              – ottse
              Mar 9 '14 at 18:16








            1




            1





            You've forgot to make sure the config dir is created. This can fail. Also you haven't closed the streams.

            – Yaroslav Mytkalyk
            Mar 9 '14 at 17:28





            You've forgot to make sure the config dir is created. This can fail. Also you haven't closed the streams.

            – Yaroslav Mytkalyk
            Mar 9 '14 at 17:28




            1




            1





            After wrote data to file U must close streams connections

            – a.black13
            Mar 9 '14 at 17:41





            After wrote data to file U must close streams connections

            – a.black13
            Mar 9 '14 at 17:41













            Now everyone should be happy :P

            – ottse
            Mar 9 '14 at 18:16





            Now everyone should be happy :P

            – ottse
            Mar 9 '14 at 18:16











            0














            For this case, especially on Android, the way going for bytes is usually faster.



            With this, I solved it by setting up a class which is given the responsibility to deal with reading/writing bytes from/to file through stream.



            As far as it's knew generally, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset) can help us to transfer string you want to bytes you need.



            To use FileHelper, run as below: FileHelper.getInstance().writeStringToFile(FileHelper.getInstance().createInternalFile("dir_name", "file_name.txt", context), "a string going to be written to /dir_name/file_name.txt", null);



            public class FileHelper {
            private static final String DEFAULT_DIR_NAME = "AmoFromTaiwan";
            private static final int DEFAULT_BUFFER_SIZE = 1024;
            private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
            private static final int EOF = -1;
            private static FileHelper INSTANCE = new FileHelper();

            public static FileHelper getInstance() {
            return INSTANCE;
            }

            private boolean isExternalStorageWritable(Context context) {
            /*
            String state = Environment.getExternalStorageState();
            return Environment.MEDIA_MOUNTED.equals(state);
            */
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            return true;
            } else {
            Logger.e("!!! checkSelfPermission() not granted");
            return false;
            }
            } else { //permission is automatically granted on sdk<23 upon installation
            return true;
            }
            }

            private boolean isExternalStorageReadable(Context context) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (context.checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            return true;
            } else {
            Logger.e("!!! checkSelfPermission() not granted");
            return false;
            }
            } else { //permission is automatically granted on sdk<23 upon installation
            return true;
            }
            }

            @SuppressLint("SimpleDateFormat")
            private String generateFileNameBasedOnTimeStamp() {
            return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
            }

            public File createExternalFile(String dir_name, String file_name, Context context) {
            String dir_path;
            String file_path;
            File dir ;
            File file;
            if (!isExternalStorageWritable(context)) {
            Logger.e("!!! external storage not writable");
            return null;
            }
            if (dir_name == null) {
            dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
            } else {
            dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
            }
            Logger.d("... going to access an external dir:" + dir_path);
            dir = new File(dir_path);
            if (!dir.exists()) {
            Logger.d("... going to mkdirs:" + dir_path);
            if (!dir.mkdirs()) {
            Logger.e("!!! failed to mkdirs");
            return null;
            }
            }
            if (file_name == null) {
            file_path = dir_path + File.separator + generateFileNameBasedOnTimeStamp();
            } else {
            file_path = dir_path + File.separator + file_name;
            }
            Logger.d("... going to return an external dir:" + file_path);
            file = new File(file_path);
            if (file.exists()) {
            Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
            if (!file.delete()) {
            Logger.e("!!! failed to delete file");
            return null;
            }
            }
            return file;
            }

            public File createInternalFile(String dir_name, String file_name, Context context) {
            String dir_path;
            String file_path;
            File dir ;
            File file;
            if (dir_name == null) {
            dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
            } else {
            dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
            }
            dir_path = dir.getAbsolutePath();
            Logger.d("... going to access an internal dir:" + dir_path);
            if (!dir.exists()) {
            Logger.d("... going to mkdirs:" + dir_path);
            if (!dir.mkdirs()) {
            Logger.e("!!! mkdirs failed");
            return null;
            }
            }
            if (file_name == null) {
            file = new File(dir, generateFileNameBasedOnTimeStamp());
            } else {
            file = new File(dir, file_name);
            }
            file_path = file.getAbsolutePath();
            Logger.d("... going to return an internal dir:" + file_path);
            if (file.exists()) {
            Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
            if (!file.delete()) {
            Logger.e("!!! failed to delete file");
            return null;
            }
            }
            return file;
            }

            public File getExternalFile(String dir_name, String file_name, Context context) {
            String dir_path;
            String file_path;
            File file;
            if (!isExternalStorageWritable(context)) {
            Logger.e("!!! external storage not writable");
            return null;
            }
            if (dir_name == null) {
            dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
            } else {
            dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
            }
            if (file_name == null) {
            file_path = dir_path;
            } else {
            file_path = dir_path + File.separator + file_name;
            }
            Logger.d("... going to return an external file:" + file_path);
            file = new File(file_path);
            if (file.exists()) {
            Logger.d("... file exists:" + file.getAbsolutePath());
            } else {
            Logger.e("!!! file does't exist:" + file.getAbsolutePath());
            }
            return file;
            }

            public File getInternalFile(String dir_name, String file_name, Context context) {
            String file_path;
            File dir ;
            File file;
            if (dir_name == null) {
            dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
            } else {
            dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
            }
            if (file_name == null) {
            file = new File(dir.getAbsolutePath());
            } else {
            file = new File(dir, file_name);
            }
            file_path = file.getAbsolutePath();
            Logger.d("... going to return an internal dir:" + file_path);
            if (file.exists()) {
            Logger.d("... file exists:" + file.getAbsolutePath());
            } else {
            Logger.e("!!! file does't exist:" + file.getAbsolutePath());
            }
            return file;
            }

            private byte readBytesFromFile(File file) {
            Logger.d(">>> path:" + file.getAbsolutePath());
            FileInputStream fis;
            long file_length;
            byte buffer;
            int offset = 0;
            int next = 0;
            if (!file.exists()) {
            Logger.e("!!! file doesn't exists");
            return null;
            }
            if (file.length() > Integer.MAX_VALUE) {
            Logger.e("!!! file length is out of max of int");
            return null;
            } else {
            file_length = file.length();
            }
            try {
            fis = new FileInputStream(file);
            //buffer = new byte[(int) file_length];
            buffer = new byte[(int) file.length()];
            long time_start = System.currentTimeMillis();
            while (true) {
            Logger.d("... now next:" + next + " and offset:" + offset);
            if (System.currentTimeMillis() - time_start > 1000) {
            Logger.e("!!! left due to time out");
            break;
            }
            next = fis.read(buffer, offset, (buffer.length-offset));
            if (next < 0 || offset >= buffer.length) {
            Logger.d("... completed to read");
            break;
            }
            offset += next;
            }
            //if (offset < buffer.length) {
            if (offset < (int) file_length) {
            Logger.e("!!! not complete to read");
            return null;
            }
            fis.close();
            return buffer;
            } catch (IOException e) {
            e.printStackTrace();
            Logger.e("!!! IOException");
            return null;
            }
            }

            public byte readBytesFromFile(File file, boolean is_fis_fos_only) {
            if (file == null) return null;
            if (is_fis_fos_only) {
            return readBytesFromFile(file);
            }
            Logger.d(">>> path:" + file.getAbsolutePath());
            FileInputStream fis;
            BufferedInputStream bis;
            ByteArrayOutputStream bos;
            byte buf = new byte[(int) file.length()];
            int num_read;
            if (!file.exists()) {
            Logger.e("!!! file doesn't exists");
            return null;
            }
            try {
            fis = new FileInputStream(file);
            bis = new BufferedInputStream(fis);
            bos = new ByteArrayOutputStream();
            long time_start = System.currentTimeMillis();
            while (true) {
            if (System.currentTimeMillis() - time_start > 1000) {
            Logger.e("!!! left due to time out");
            break;
            }
            num_read = bis.read(buf, 0, buf.length); //1024 bytes per call
            if (num_read < 0) break;
            bos.write(buf, 0, num_read);
            }
            buf = bos.toByteArray();
            fis.close();
            bis.close();
            bos.close();
            return buf;
            } catch (FileNotFoundException e) {
            e.printStackTrace();
            Logger.e("!!! FileNotFoundException");
            return null;
            } catch (IOException e) {
            e.printStackTrace();
            Logger.e("!!! IOException");
            return null;
            }
            }

            /**
            * streams (InputStream and OutputStream) transfer binary data
            * if to write a string to a stream, must first convert it to bytes, or in other words encode it
            */
            public boolean writeStringToFile(File file, String string, Charset charset) {
            if (file == null) return false;
            if (string == null) return false;
            return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
            }

            public boolean writeBytesToFile(File file, byte data) {
            if (file == null) return false;
            if (data == null) return false;
            FileOutputStream fos;
            BufferedOutputStream bos;
            try {
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(data, 0, data.length);
            bos.flush();
            bos.close();
            fos.close();
            } catch (IOException e) {
            e.printStackTrace();
            Logger.e("!!! IOException");
            return false;
            }
            return true;
            }

            /**
            * io blocks until some input/output is available.
            */
            public boolean copy(File source, File destination) {
            if (source == null || destination == null) return false;
            Logger.d(">>> source:" + source.getAbsolutePath() + ", destination:" + destination.getAbsolutePath());
            try {
            FileInputStream fis = new FileInputStream(source);
            FileOutputStream fos = new FileOutputStream(destination);
            byte buffer = new byte[(int) source.length()];
            int len;
            while (EOF != (len = fis.read(buffer))) {
            fos.write(buffer, 0, len);
            }
            if (true) { //debug
            byte copies = readBytesFromFile(destination);
            if (copies != null) {
            int copy_len = copies.length;
            Logger.d("... stream read and write done for " + copy_len + " bytes");
            }
            }
            return destination.length() != 0;
            } catch (IOException e) {
            e.printStackTrace();
            return false;
            }
            }

            public void list(final String path, final String end, final List<File> files) {
            Logger.d(">>> path:" + path + ", end:" + end);
            File file = new File(path);
            if (file.isDirectory()) {
            for (File child : file.listFiles()){
            list(child.getAbsolutePath(), end, files);
            }
            } else if (file.isFile()) {
            if (end.equals("")) {
            files.add(file);
            } else {
            if (file.getName().endsWith(end)) files.add(file);
            }
            }
            }

            public String splitFileName(File file, String split) {
            String path;
            String ext;
            int lastIndexOfSplit = file.getAbsolutePath().lastIndexOf(split);
            if (lastIndexOfSplit < 0) {
            path = file.getAbsolutePath();
            ext = "";
            } else {
            path = file.getAbsolutePath().substring(0, lastIndexOfSplit);
            ext = file.getAbsolutePath().substring(lastIndexOfSplit);
            }
            return new String {path, ext};
            }

            public File rename(File old_file, String new_name) {
            if (old_file == null || new_name == null) return null;
            Logger.d(">>> old file path:" + old_file.getAbsolutePath() + ", new file name:" + new_name);
            File new_file = new File(old_file, new_name);
            if (!old_file.equals(new_file)) {
            if (new_file.exists()) { //if find out previous file/dir at new path name exists
            if (new_file.delete()) {
            Logger.d("... succeeded to delete previous file at new abstract path name:" + new_file.getAbsolutePath());
            } else {
            Logger.e("!!! failed to delete previous file at new abstract path name");
            return null;
            }
            }
            if (old_file.renameTo(new_file)) {
            Logger.d("... succeeded to rename old file to new abstract path name:" + new_file.getAbsolutePath());
            } else {
            Logger.e("!!! failed to rename old file to new abstract path name");
            }
            } else {
            Logger.d("... new and old file have the equal abstract path name:" + new_file.getAbsolutePath());
            }
            return new_file;
            }

            public boolean remove(final String path, final String end) {
            Logger.d(">>> path:" + path + ", end:" + end);
            File file = new File(path);
            boolean result = false;
            if (file.isDirectory()) {
            for (File child : file.listFiles()){
            result = remove(child.getAbsolutePath(), end);
            }
            } else if (file.isFile()) {
            if (end.equals("")) {
            result = file.delete();
            } else {
            if (file.getName().endsWith(end)) result = file.delete();
            }
            } else {
            Logger.e("!!! child is not file or directory");
            }
            return result;
            }

            @TargetApi(Build.VERSION_CODES.O)
            public byte readNIOBytesFromFile(String path) throws IOException {
            Logger.d(">>> path:" + path);
            if (!Files.exists(Paths.get(path), LinkOption.NOFOLLOW_LINKS)) {
            Logger.e("!!! file doesn't exists");
            return null;
            } else {
            return Files.readAllBytes(Paths.get(path));
            }
            }

            @TargetApi(Build.VERSION_CODES.O)
            public File writeNIOBytesToFile(String dir, String name, byte data) {
            Logger.d(">>> dir:" + dir + ", name:" + name);
            Path path_dir;
            Path path_file;
            try {
            if (!Files.exists(Paths.get(dir), LinkOption.NOFOLLOW_LINKS)) {
            Logger.d("... make a dir");
            path_dir = Files.createDirectories(Paths.get(dir));
            if (path_dir == null) {
            Logger.e("!!! failed to make a dir");
            return null;
            }
            }
            path_file = Files.write(Paths.get(name), data);
            return path_file.toFile();
            } catch (IOException e) {
            e.printStackTrace();
            Logger.e("!!! IOException");
            return null;
            }
            }

            @TargetApi(Build.VERSION_CODES.O)
            public void listNIO(final String dir, final String end, final List<File> files) throws IOException {
            Logger.d(">>> dir:" + dir + ", end:" + end);
            Files.walkFileTree(Paths.get(dir), new FileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
            Logger.d("... file:" + dir.getFileName());
            return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
            Logger.d("... file:" + file.getFileName());
            if (end.equals("")) {
            files.add(file.toFile());
            } else {
            if (file.endsWith(end)) files.add(file.toFile());
            }
            return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) {
            Logger.d("... file:" + file.getFileName());
            if (end.equals("")) {
            files.add(file.toFile());
            } else {
            if (file.endsWith(end)) files.add(file.toFile());
            }
            return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
            Logger.d("... file:" + dir.getFileName());
            return FileVisitResult.CONTINUE;
            }
            });
            }

            /**
            * recursion
            */
            private int factorial (int x) {
            if (x > 1) return (x*(factorial(x-1)));
            else if (x == 1) return x;
            else return 0;
            }


            }






            share|improve this answer






























              0














              For this case, especially on Android, the way going for bytes is usually faster.



              With this, I solved it by setting up a class which is given the responsibility to deal with reading/writing bytes from/to file through stream.



              As far as it's knew generally, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset) can help us to transfer string you want to bytes you need.



              To use FileHelper, run as below: FileHelper.getInstance().writeStringToFile(FileHelper.getInstance().createInternalFile("dir_name", "file_name.txt", context), "a string going to be written to /dir_name/file_name.txt", null);



              public class FileHelper {
              private static final String DEFAULT_DIR_NAME = "AmoFromTaiwan";
              private static final int DEFAULT_BUFFER_SIZE = 1024;
              private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
              private static final int EOF = -1;
              private static FileHelper INSTANCE = new FileHelper();

              public static FileHelper getInstance() {
              return INSTANCE;
              }

              private boolean isExternalStorageWritable(Context context) {
              /*
              String state = Environment.getExternalStorageState();
              return Environment.MEDIA_MOUNTED.equals(state);
              */
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
              return true;
              } else {
              Logger.e("!!! checkSelfPermission() not granted");
              return false;
              }
              } else { //permission is automatically granted on sdk<23 upon installation
              return true;
              }
              }

              private boolean isExternalStorageReadable(Context context) {
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              if (context.checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
              return true;
              } else {
              Logger.e("!!! checkSelfPermission() not granted");
              return false;
              }
              } else { //permission is automatically granted on sdk<23 upon installation
              return true;
              }
              }

              @SuppressLint("SimpleDateFormat")
              private String generateFileNameBasedOnTimeStamp() {
              return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
              }

              public File createExternalFile(String dir_name, String file_name, Context context) {
              String dir_path;
              String file_path;
              File dir ;
              File file;
              if (!isExternalStorageWritable(context)) {
              Logger.e("!!! external storage not writable");
              return null;
              }
              if (dir_name == null) {
              dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
              } else {
              dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
              }
              Logger.d("... going to access an external dir:" + dir_path);
              dir = new File(dir_path);
              if (!dir.exists()) {
              Logger.d("... going to mkdirs:" + dir_path);
              if (!dir.mkdirs()) {
              Logger.e("!!! failed to mkdirs");
              return null;
              }
              }
              if (file_name == null) {
              file_path = dir_path + File.separator + generateFileNameBasedOnTimeStamp();
              } else {
              file_path = dir_path + File.separator + file_name;
              }
              Logger.d("... going to return an external dir:" + file_path);
              file = new File(file_path);
              if (file.exists()) {
              Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
              if (!file.delete()) {
              Logger.e("!!! failed to delete file");
              return null;
              }
              }
              return file;
              }

              public File createInternalFile(String dir_name, String file_name, Context context) {
              String dir_path;
              String file_path;
              File dir ;
              File file;
              if (dir_name == null) {
              dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
              } else {
              dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
              }
              dir_path = dir.getAbsolutePath();
              Logger.d("... going to access an internal dir:" + dir_path);
              if (!dir.exists()) {
              Logger.d("... going to mkdirs:" + dir_path);
              if (!dir.mkdirs()) {
              Logger.e("!!! mkdirs failed");
              return null;
              }
              }
              if (file_name == null) {
              file = new File(dir, generateFileNameBasedOnTimeStamp());
              } else {
              file = new File(dir, file_name);
              }
              file_path = file.getAbsolutePath();
              Logger.d("... going to return an internal dir:" + file_path);
              if (file.exists()) {
              Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
              if (!file.delete()) {
              Logger.e("!!! failed to delete file");
              return null;
              }
              }
              return file;
              }

              public File getExternalFile(String dir_name, String file_name, Context context) {
              String dir_path;
              String file_path;
              File file;
              if (!isExternalStorageWritable(context)) {
              Logger.e("!!! external storage not writable");
              return null;
              }
              if (dir_name == null) {
              dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
              } else {
              dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
              }
              if (file_name == null) {
              file_path = dir_path;
              } else {
              file_path = dir_path + File.separator + file_name;
              }
              Logger.d("... going to return an external file:" + file_path);
              file = new File(file_path);
              if (file.exists()) {
              Logger.d("... file exists:" + file.getAbsolutePath());
              } else {
              Logger.e("!!! file does't exist:" + file.getAbsolutePath());
              }
              return file;
              }

              public File getInternalFile(String dir_name, String file_name, Context context) {
              String file_path;
              File dir ;
              File file;
              if (dir_name == null) {
              dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
              } else {
              dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
              }
              if (file_name == null) {
              file = new File(dir.getAbsolutePath());
              } else {
              file = new File(dir, file_name);
              }
              file_path = file.getAbsolutePath();
              Logger.d("... going to return an internal dir:" + file_path);
              if (file.exists()) {
              Logger.d("... file exists:" + file.getAbsolutePath());
              } else {
              Logger.e("!!! file does't exist:" + file.getAbsolutePath());
              }
              return file;
              }

              private byte readBytesFromFile(File file) {
              Logger.d(">>> path:" + file.getAbsolutePath());
              FileInputStream fis;
              long file_length;
              byte buffer;
              int offset = 0;
              int next = 0;
              if (!file.exists()) {
              Logger.e("!!! file doesn't exists");
              return null;
              }
              if (file.length() > Integer.MAX_VALUE) {
              Logger.e("!!! file length is out of max of int");
              return null;
              } else {
              file_length = file.length();
              }
              try {
              fis = new FileInputStream(file);
              //buffer = new byte[(int) file_length];
              buffer = new byte[(int) file.length()];
              long time_start = System.currentTimeMillis();
              while (true) {
              Logger.d("... now next:" + next + " and offset:" + offset);
              if (System.currentTimeMillis() - time_start > 1000) {
              Logger.e("!!! left due to time out");
              break;
              }
              next = fis.read(buffer, offset, (buffer.length-offset));
              if (next < 0 || offset >= buffer.length) {
              Logger.d("... completed to read");
              break;
              }
              offset += next;
              }
              //if (offset < buffer.length) {
              if (offset < (int) file_length) {
              Logger.e("!!! not complete to read");
              return null;
              }
              fis.close();
              return buffer;
              } catch (IOException e) {
              e.printStackTrace();
              Logger.e("!!! IOException");
              return null;
              }
              }

              public byte readBytesFromFile(File file, boolean is_fis_fos_only) {
              if (file == null) return null;
              if (is_fis_fos_only) {
              return readBytesFromFile(file);
              }
              Logger.d(">>> path:" + file.getAbsolutePath());
              FileInputStream fis;
              BufferedInputStream bis;
              ByteArrayOutputStream bos;
              byte buf = new byte[(int) file.length()];
              int num_read;
              if (!file.exists()) {
              Logger.e("!!! file doesn't exists");
              return null;
              }
              try {
              fis = new FileInputStream(file);
              bis = new BufferedInputStream(fis);
              bos = new ByteArrayOutputStream();
              long time_start = System.currentTimeMillis();
              while (true) {
              if (System.currentTimeMillis() - time_start > 1000) {
              Logger.e("!!! left due to time out");
              break;
              }
              num_read = bis.read(buf, 0, buf.length); //1024 bytes per call
              if (num_read < 0) break;
              bos.write(buf, 0, num_read);
              }
              buf = bos.toByteArray();
              fis.close();
              bis.close();
              bos.close();
              return buf;
              } catch (FileNotFoundException e) {
              e.printStackTrace();
              Logger.e("!!! FileNotFoundException");
              return null;
              } catch (IOException e) {
              e.printStackTrace();
              Logger.e("!!! IOException");
              return null;
              }
              }

              /**
              * streams (InputStream and OutputStream) transfer binary data
              * if to write a string to a stream, must first convert it to bytes, or in other words encode it
              */
              public boolean writeStringToFile(File file, String string, Charset charset) {
              if (file == null) return false;
              if (string == null) return false;
              return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
              }

              public boolean writeBytesToFile(File file, byte data) {
              if (file == null) return false;
              if (data == null) return false;
              FileOutputStream fos;
              BufferedOutputStream bos;
              try {
              fos = new FileOutputStream(file);
              bos = new BufferedOutputStream(fos);
              bos.write(data, 0, data.length);
              bos.flush();
              bos.close();
              fos.close();
              } catch (IOException e) {
              e.printStackTrace();
              Logger.e("!!! IOException");
              return false;
              }
              return true;
              }

              /**
              * io blocks until some input/output is available.
              */
              public boolean copy(File source, File destination) {
              if (source == null || destination == null) return false;
              Logger.d(">>> source:" + source.getAbsolutePath() + ", destination:" + destination.getAbsolutePath());
              try {
              FileInputStream fis = new FileInputStream(source);
              FileOutputStream fos = new FileOutputStream(destination);
              byte buffer = new byte[(int) source.length()];
              int len;
              while (EOF != (len = fis.read(buffer))) {
              fos.write(buffer, 0, len);
              }
              if (true) { //debug
              byte copies = readBytesFromFile(destination);
              if (copies != null) {
              int copy_len = copies.length;
              Logger.d("... stream read and write done for " + copy_len + " bytes");
              }
              }
              return destination.length() != 0;
              } catch (IOException e) {
              e.printStackTrace();
              return false;
              }
              }

              public void list(final String path, final String end, final List<File> files) {
              Logger.d(">>> path:" + path + ", end:" + end);
              File file = new File(path);
              if (file.isDirectory()) {
              for (File child : file.listFiles()){
              list(child.getAbsolutePath(), end, files);
              }
              } else if (file.isFile()) {
              if (end.equals("")) {
              files.add(file);
              } else {
              if (file.getName().endsWith(end)) files.add(file);
              }
              }
              }

              public String splitFileName(File file, String split) {
              String path;
              String ext;
              int lastIndexOfSplit = file.getAbsolutePath().lastIndexOf(split);
              if (lastIndexOfSplit < 0) {
              path = file.getAbsolutePath();
              ext = "";
              } else {
              path = file.getAbsolutePath().substring(0, lastIndexOfSplit);
              ext = file.getAbsolutePath().substring(lastIndexOfSplit);
              }
              return new String {path, ext};
              }

              public File rename(File old_file, String new_name) {
              if (old_file == null || new_name == null) return null;
              Logger.d(">>> old file path:" + old_file.getAbsolutePath() + ", new file name:" + new_name);
              File new_file = new File(old_file, new_name);
              if (!old_file.equals(new_file)) {
              if (new_file.exists()) { //if find out previous file/dir at new path name exists
              if (new_file.delete()) {
              Logger.d("... succeeded to delete previous file at new abstract path name:" + new_file.getAbsolutePath());
              } else {
              Logger.e("!!! failed to delete previous file at new abstract path name");
              return null;
              }
              }
              if (old_file.renameTo(new_file)) {
              Logger.d("... succeeded to rename old file to new abstract path name:" + new_file.getAbsolutePath());
              } else {
              Logger.e("!!! failed to rename old file to new abstract path name");
              }
              } else {
              Logger.d("... new and old file have the equal abstract path name:" + new_file.getAbsolutePath());
              }
              return new_file;
              }

              public boolean remove(final String path, final String end) {
              Logger.d(">>> path:" + path + ", end:" + end);
              File file = new File(path);
              boolean result = false;
              if (file.isDirectory()) {
              for (File child : file.listFiles()){
              result = remove(child.getAbsolutePath(), end);
              }
              } else if (file.isFile()) {
              if (end.equals("")) {
              result = file.delete();
              } else {
              if (file.getName().endsWith(end)) result = file.delete();
              }
              } else {
              Logger.e("!!! child is not file or directory");
              }
              return result;
              }

              @TargetApi(Build.VERSION_CODES.O)
              public byte readNIOBytesFromFile(String path) throws IOException {
              Logger.d(">>> path:" + path);
              if (!Files.exists(Paths.get(path), LinkOption.NOFOLLOW_LINKS)) {
              Logger.e("!!! file doesn't exists");
              return null;
              } else {
              return Files.readAllBytes(Paths.get(path));
              }
              }

              @TargetApi(Build.VERSION_CODES.O)
              public File writeNIOBytesToFile(String dir, String name, byte data) {
              Logger.d(">>> dir:" + dir + ", name:" + name);
              Path path_dir;
              Path path_file;
              try {
              if (!Files.exists(Paths.get(dir), LinkOption.NOFOLLOW_LINKS)) {
              Logger.d("... make a dir");
              path_dir = Files.createDirectories(Paths.get(dir));
              if (path_dir == null) {
              Logger.e("!!! failed to make a dir");
              return null;
              }
              }
              path_file = Files.write(Paths.get(name), data);
              return path_file.toFile();
              } catch (IOException e) {
              e.printStackTrace();
              Logger.e("!!! IOException");
              return null;
              }
              }

              @TargetApi(Build.VERSION_CODES.O)
              public void listNIO(final String dir, final String end, final List<File> files) throws IOException {
              Logger.d(">>> dir:" + dir + ", end:" + end);
              Files.walkFileTree(Paths.get(dir), new FileVisitor<Path>() {
              @Override
              public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
              Logger.d("... file:" + dir.getFileName());
              return FileVisitResult.CONTINUE;
              }

              @Override
              public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
              Logger.d("... file:" + file.getFileName());
              if (end.equals("")) {
              files.add(file.toFile());
              } else {
              if (file.endsWith(end)) files.add(file.toFile());
              }
              return FileVisitResult.CONTINUE;
              }

              @Override
              public FileVisitResult visitFileFailed(Path file, IOException exc) {
              Logger.d("... file:" + file.getFileName());
              if (end.equals("")) {
              files.add(file.toFile());
              } else {
              if (file.endsWith(end)) files.add(file.toFile());
              }
              return FileVisitResult.CONTINUE;
              }

              @Override
              public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
              Logger.d("... file:" + dir.getFileName());
              return FileVisitResult.CONTINUE;
              }
              });
              }

              /**
              * recursion
              */
              private int factorial (int x) {
              if (x > 1) return (x*(factorial(x-1)));
              else if (x == 1) return x;
              else return 0;
              }


              }






              share|improve this answer




























                0












                0








                0







                For this case, especially on Android, the way going for bytes is usually faster.



                With this, I solved it by setting up a class which is given the responsibility to deal with reading/writing bytes from/to file through stream.



                As far as it's knew generally, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset) can help us to transfer string you want to bytes you need.



                To use FileHelper, run as below: FileHelper.getInstance().writeStringToFile(FileHelper.getInstance().createInternalFile("dir_name", "file_name.txt", context), "a string going to be written to /dir_name/file_name.txt", null);



                public class FileHelper {
                private static final String DEFAULT_DIR_NAME = "AmoFromTaiwan";
                private static final int DEFAULT_BUFFER_SIZE = 1024;
                private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
                private static final int EOF = -1;
                private static FileHelper INSTANCE = new FileHelper();

                public static FileHelper getInstance() {
                return INSTANCE;
                }

                private boolean isExternalStorageWritable(Context context) {
                /*
                String state = Environment.getExternalStorageState();
                return Environment.MEDIA_MOUNTED.equals(state);
                */
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                return true;
                } else {
                Logger.e("!!! checkSelfPermission() not granted");
                return false;
                }
                } else { //permission is automatically granted on sdk<23 upon installation
                return true;
                }
                }

                private boolean isExternalStorageReadable(Context context) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (context.checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                return true;
                } else {
                Logger.e("!!! checkSelfPermission() not granted");
                return false;
                }
                } else { //permission is automatically granted on sdk<23 upon installation
                return true;
                }
                }

                @SuppressLint("SimpleDateFormat")
                private String generateFileNameBasedOnTimeStamp() {
                return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
                }

                public File createExternalFile(String dir_name, String file_name, Context context) {
                String dir_path;
                String file_path;
                File dir ;
                File file;
                if (!isExternalStorageWritable(context)) {
                Logger.e("!!! external storage not writable");
                return null;
                }
                if (dir_name == null) {
                dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
                } else {
                dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
                }
                Logger.d("... going to access an external dir:" + dir_path);
                dir = new File(dir_path);
                if (!dir.exists()) {
                Logger.d("... going to mkdirs:" + dir_path);
                if (!dir.mkdirs()) {
                Logger.e("!!! failed to mkdirs");
                return null;
                }
                }
                if (file_name == null) {
                file_path = dir_path + File.separator + generateFileNameBasedOnTimeStamp();
                } else {
                file_path = dir_path + File.separator + file_name;
                }
                Logger.d("... going to return an external dir:" + file_path);
                file = new File(file_path);
                if (file.exists()) {
                Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
                if (!file.delete()) {
                Logger.e("!!! failed to delete file");
                return null;
                }
                }
                return file;
                }

                public File createInternalFile(String dir_name, String file_name, Context context) {
                String dir_path;
                String file_path;
                File dir ;
                File file;
                if (dir_name == null) {
                dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
                } else {
                dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
                }
                dir_path = dir.getAbsolutePath();
                Logger.d("... going to access an internal dir:" + dir_path);
                if (!dir.exists()) {
                Logger.d("... going to mkdirs:" + dir_path);
                if (!dir.mkdirs()) {
                Logger.e("!!! mkdirs failed");
                return null;
                }
                }
                if (file_name == null) {
                file = new File(dir, generateFileNameBasedOnTimeStamp());
                } else {
                file = new File(dir, file_name);
                }
                file_path = file.getAbsolutePath();
                Logger.d("... going to return an internal dir:" + file_path);
                if (file.exists()) {
                Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
                if (!file.delete()) {
                Logger.e("!!! failed to delete file");
                return null;
                }
                }
                return file;
                }

                public File getExternalFile(String dir_name, String file_name, Context context) {
                String dir_path;
                String file_path;
                File file;
                if (!isExternalStorageWritable(context)) {
                Logger.e("!!! external storage not writable");
                return null;
                }
                if (dir_name == null) {
                dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
                } else {
                dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
                }
                if (file_name == null) {
                file_path = dir_path;
                } else {
                file_path = dir_path + File.separator + file_name;
                }
                Logger.d("... going to return an external file:" + file_path);
                file = new File(file_path);
                if (file.exists()) {
                Logger.d("... file exists:" + file.getAbsolutePath());
                } else {
                Logger.e("!!! file does't exist:" + file.getAbsolutePath());
                }
                return file;
                }

                public File getInternalFile(String dir_name, String file_name, Context context) {
                String file_path;
                File dir ;
                File file;
                if (dir_name == null) {
                dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
                } else {
                dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
                }
                if (file_name == null) {
                file = new File(dir.getAbsolutePath());
                } else {
                file = new File(dir, file_name);
                }
                file_path = file.getAbsolutePath();
                Logger.d("... going to return an internal dir:" + file_path);
                if (file.exists()) {
                Logger.d("... file exists:" + file.getAbsolutePath());
                } else {
                Logger.e("!!! file does't exist:" + file.getAbsolutePath());
                }
                return file;
                }

                private byte readBytesFromFile(File file) {
                Logger.d(">>> path:" + file.getAbsolutePath());
                FileInputStream fis;
                long file_length;
                byte buffer;
                int offset = 0;
                int next = 0;
                if (!file.exists()) {
                Logger.e("!!! file doesn't exists");
                return null;
                }
                if (file.length() > Integer.MAX_VALUE) {
                Logger.e("!!! file length is out of max of int");
                return null;
                } else {
                file_length = file.length();
                }
                try {
                fis = new FileInputStream(file);
                //buffer = new byte[(int) file_length];
                buffer = new byte[(int) file.length()];
                long time_start = System.currentTimeMillis();
                while (true) {
                Logger.d("... now next:" + next + " and offset:" + offset);
                if (System.currentTimeMillis() - time_start > 1000) {
                Logger.e("!!! left due to time out");
                break;
                }
                next = fis.read(buffer, offset, (buffer.length-offset));
                if (next < 0 || offset >= buffer.length) {
                Logger.d("... completed to read");
                break;
                }
                offset += next;
                }
                //if (offset < buffer.length) {
                if (offset < (int) file_length) {
                Logger.e("!!! not complete to read");
                return null;
                }
                fis.close();
                return buffer;
                } catch (IOException e) {
                e.printStackTrace();
                Logger.e("!!! IOException");
                return null;
                }
                }

                public byte readBytesFromFile(File file, boolean is_fis_fos_only) {
                if (file == null) return null;
                if (is_fis_fos_only) {
                return readBytesFromFile(file);
                }
                Logger.d(">>> path:" + file.getAbsolutePath());
                FileInputStream fis;
                BufferedInputStream bis;
                ByteArrayOutputStream bos;
                byte buf = new byte[(int) file.length()];
                int num_read;
                if (!file.exists()) {
                Logger.e("!!! file doesn't exists");
                return null;
                }
                try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                bos = new ByteArrayOutputStream();
                long time_start = System.currentTimeMillis();
                while (true) {
                if (System.currentTimeMillis() - time_start > 1000) {
                Logger.e("!!! left due to time out");
                break;
                }
                num_read = bis.read(buf, 0, buf.length); //1024 bytes per call
                if (num_read < 0) break;
                bos.write(buf, 0, num_read);
                }
                buf = bos.toByteArray();
                fis.close();
                bis.close();
                bos.close();
                return buf;
                } catch (FileNotFoundException e) {
                e.printStackTrace();
                Logger.e("!!! FileNotFoundException");
                return null;
                } catch (IOException e) {
                e.printStackTrace();
                Logger.e("!!! IOException");
                return null;
                }
                }

                /**
                * streams (InputStream and OutputStream) transfer binary data
                * if to write a string to a stream, must first convert it to bytes, or in other words encode it
                */
                public boolean writeStringToFile(File file, String string, Charset charset) {
                if (file == null) return false;
                if (string == null) return false;
                return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
                }

                public boolean writeBytesToFile(File file, byte data) {
                if (file == null) return false;
                if (data == null) return false;
                FileOutputStream fos;
                BufferedOutputStream bos;
                try {
                fos = new FileOutputStream(file);
                bos = new BufferedOutputStream(fos);
                bos.write(data, 0, data.length);
                bos.flush();
                bos.close();
                fos.close();
                } catch (IOException e) {
                e.printStackTrace();
                Logger.e("!!! IOException");
                return false;
                }
                return true;
                }

                /**
                * io blocks until some input/output is available.
                */
                public boolean copy(File source, File destination) {
                if (source == null || destination == null) return false;
                Logger.d(">>> source:" + source.getAbsolutePath() + ", destination:" + destination.getAbsolutePath());
                try {
                FileInputStream fis = new FileInputStream(source);
                FileOutputStream fos = new FileOutputStream(destination);
                byte buffer = new byte[(int) source.length()];
                int len;
                while (EOF != (len = fis.read(buffer))) {
                fos.write(buffer, 0, len);
                }
                if (true) { //debug
                byte copies = readBytesFromFile(destination);
                if (copies != null) {
                int copy_len = copies.length;
                Logger.d("... stream read and write done for " + copy_len + " bytes");
                }
                }
                return destination.length() != 0;
                } catch (IOException e) {
                e.printStackTrace();
                return false;
                }
                }

                public void list(final String path, final String end, final List<File> files) {
                Logger.d(">>> path:" + path + ", end:" + end);
                File file = new File(path);
                if (file.isDirectory()) {
                for (File child : file.listFiles()){
                list(child.getAbsolutePath(), end, files);
                }
                } else if (file.isFile()) {
                if (end.equals("")) {
                files.add(file);
                } else {
                if (file.getName().endsWith(end)) files.add(file);
                }
                }
                }

                public String splitFileName(File file, String split) {
                String path;
                String ext;
                int lastIndexOfSplit = file.getAbsolutePath().lastIndexOf(split);
                if (lastIndexOfSplit < 0) {
                path = file.getAbsolutePath();
                ext = "";
                } else {
                path = file.getAbsolutePath().substring(0, lastIndexOfSplit);
                ext = file.getAbsolutePath().substring(lastIndexOfSplit);
                }
                return new String {path, ext};
                }

                public File rename(File old_file, String new_name) {
                if (old_file == null || new_name == null) return null;
                Logger.d(">>> old file path:" + old_file.getAbsolutePath() + ", new file name:" + new_name);
                File new_file = new File(old_file, new_name);
                if (!old_file.equals(new_file)) {
                if (new_file.exists()) { //if find out previous file/dir at new path name exists
                if (new_file.delete()) {
                Logger.d("... succeeded to delete previous file at new abstract path name:" + new_file.getAbsolutePath());
                } else {
                Logger.e("!!! failed to delete previous file at new abstract path name");
                return null;
                }
                }
                if (old_file.renameTo(new_file)) {
                Logger.d("... succeeded to rename old file to new abstract path name:" + new_file.getAbsolutePath());
                } else {
                Logger.e("!!! failed to rename old file to new abstract path name");
                }
                } else {
                Logger.d("... new and old file have the equal abstract path name:" + new_file.getAbsolutePath());
                }
                return new_file;
                }

                public boolean remove(final String path, final String end) {
                Logger.d(">>> path:" + path + ", end:" + end);
                File file = new File(path);
                boolean result = false;
                if (file.isDirectory()) {
                for (File child : file.listFiles()){
                result = remove(child.getAbsolutePath(), end);
                }
                } else if (file.isFile()) {
                if (end.equals("")) {
                result = file.delete();
                } else {
                if (file.getName().endsWith(end)) result = file.delete();
                }
                } else {
                Logger.e("!!! child is not file or directory");
                }
                return result;
                }

                @TargetApi(Build.VERSION_CODES.O)
                public byte readNIOBytesFromFile(String path) throws IOException {
                Logger.d(">>> path:" + path);
                if (!Files.exists(Paths.get(path), LinkOption.NOFOLLOW_LINKS)) {
                Logger.e("!!! file doesn't exists");
                return null;
                } else {
                return Files.readAllBytes(Paths.get(path));
                }
                }

                @TargetApi(Build.VERSION_CODES.O)
                public File writeNIOBytesToFile(String dir, String name, byte data) {
                Logger.d(">>> dir:" + dir + ", name:" + name);
                Path path_dir;
                Path path_file;
                try {
                if (!Files.exists(Paths.get(dir), LinkOption.NOFOLLOW_LINKS)) {
                Logger.d("... make a dir");
                path_dir = Files.createDirectories(Paths.get(dir));
                if (path_dir == null) {
                Logger.e("!!! failed to make a dir");
                return null;
                }
                }
                path_file = Files.write(Paths.get(name), data);
                return path_file.toFile();
                } catch (IOException e) {
                e.printStackTrace();
                Logger.e("!!! IOException");
                return null;
                }
                }

                @TargetApi(Build.VERSION_CODES.O)
                public void listNIO(final String dir, final String end, final List<File> files) throws IOException {
                Logger.d(">>> dir:" + dir + ", end:" + end);
                Files.walkFileTree(Paths.get(dir), new FileVisitor<Path>() {
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
                Logger.d("... file:" + dir.getFileName());
                return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                Logger.d("... file:" + file.getFileName());
                if (end.equals("")) {
                files.add(file.toFile());
                } else {
                if (file.endsWith(end)) files.add(file.toFile());
                }
                return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) {
                Logger.d("... file:" + file.getFileName());
                if (end.equals("")) {
                files.add(file.toFile());
                } else {
                if (file.endsWith(end)) files.add(file.toFile());
                }
                return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
                Logger.d("... file:" + dir.getFileName());
                return FileVisitResult.CONTINUE;
                }
                });
                }

                /**
                * recursion
                */
                private int factorial (int x) {
                if (x > 1) return (x*(factorial(x-1)));
                else if (x == 1) return x;
                else return 0;
                }


                }






                share|improve this answer















                For this case, especially on Android, the way going for bytes is usually faster.



                With this, I solved it by setting up a class which is given the responsibility to deal with reading/writing bytes from/to file through stream.



                As far as it's knew generally, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset) can help us to transfer string you want to bytes you need.



                To use FileHelper, run as below: FileHelper.getInstance().writeStringToFile(FileHelper.getInstance().createInternalFile("dir_name", "file_name.txt", context), "a string going to be written to /dir_name/file_name.txt", null);



                public class FileHelper {
                private static final String DEFAULT_DIR_NAME = "AmoFromTaiwan";
                private static final int DEFAULT_BUFFER_SIZE = 1024;
                private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
                private static final int EOF = -1;
                private static FileHelper INSTANCE = new FileHelper();

                public static FileHelper getInstance() {
                return INSTANCE;
                }

                private boolean isExternalStorageWritable(Context context) {
                /*
                String state = Environment.getExternalStorageState();
                return Environment.MEDIA_MOUNTED.equals(state);
                */
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                return true;
                } else {
                Logger.e("!!! checkSelfPermission() not granted");
                return false;
                }
                } else { //permission is automatically granted on sdk<23 upon installation
                return true;
                }
                }

                private boolean isExternalStorageReadable(Context context) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (context.checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                return true;
                } else {
                Logger.e("!!! checkSelfPermission() not granted");
                return false;
                }
                } else { //permission is automatically granted on sdk<23 upon installation
                return true;
                }
                }

                @SuppressLint("SimpleDateFormat")
                private String generateFileNameBasedOnTimeStamp() {
                return new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date()) + ".jpeg";
                }

                public File createExternalFile(String dir_name, String file_name, Context context) {
                String dir_path;
                String file_path;
                File dir ;
                File file;
                if (!isExternalStorageWritable(context)) {
                Logger.e("!!! external storage not writable");
                return null;
                }
                if (dir_name == null) {
                dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
                } else {
                dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
                }
                Logger.d("... going to access an external dir:" + dir_path);
                dir = new File(dir_path);
                if (!dir.exists()) {
                Logger.d("... going to mkdirs:" + dir_path);
                if (!dir.mkdirs()) {
                Logger.e("!!! failed to mkdirs");
                return null;
                }
                }
                if (file_name == null) {
                file_path = dir_path + File.separator + generateFileNameBasedOnTimeStamp();
                } else {
                file_path = dir_path + File.separator + file_name;
                }
                Logger.d("... going to return an external dir:" + file_path);
                file = new File(file_path);
                if (file.exists()) {
                Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
                if (!file.delete()) {
                Logger.e("!!! failed to delete file");
                return null;
                }
                }
                return file;
                }

                public File createInternalFile(String dir_name, String file_name, Context context) {
                String dir_path;
                String file_path;
                File dir ;
                File file;
                if (dir_name == null) {
                dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
                } else {
                dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
                }
                dir_path = dir.getAbsolutePath();
                Logger.d("... going to access an internal dir:" + dir_path);
                if (!dir.exists()) {
                Logger.d("... going to mkdirs:" + dir_path);
                if (!dir.mkdirs()) {
                Logger.e("!!! mkdirs failed");
                return null;
                }
                }
                if (file_name == null) {
                file = new File(dir, generateFileNameBasedOnTimeStamp());
                } else {
                file = new File(dir, file_name);
                }
                file_path = file.getAbsolutePath();
                Logger.d("... going to return an internal dir:" + file_path);
                if (file.exists()) {
                Logger.d("... before creating to delete an external dir:" + file.getAbsolutePath());
                if (!file.delete()) {
                Logger.e("!!! failed to delete file");
                return null;
                }
                }
                return file;
                }

                public File getExternalFile(String dir_name, String file_name, Context context) {
                String dir_path;
                String file_path;
                File file;
                if (!isExternalStorageWritable(context)) {
                Logger.e("!!! external storage not writable");
                return null;
                }
                if (dir_name == null) {
                dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + DEFAULT_DIR_NAME;
                } else {
                dir_path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + dir_name;
                }
                if (file_name == null) {
                file_path = dir_path;
                } else {
                file_path = dir_path + File.separator + file_name;
                }
                Logger.d("... going to return an external file:" + file_path);
                file = new File(file_path);
                if (file.exists()) {
                Logger.d("... file exists:" + file.getAbsolutePath());
                } else {
                Logger.e("!!! file does't exist:" + file.getAbsolutePath());
                }
                return file;
                }

                public File getInternalFile(String dir_name, String file_name, Context context) {
                String file_path;
                File dir ;
                File file;
                if (dir_name == null) {
                dir = new ContextWrapper(context).getDir(DEFAULT_DIR_NAME, Context.MODE_PRIVATE);
                } else {
                dir = new ContextWrapper(context).getDir(dir_name, Context.MODE_PRIVATE);
                }
                if (file_name == null) {
                file = new File(dir.getAbsolutePath());
                } else {
                file = new File(dir, file_name);
                }
                file_path = file.getAbsolutePath();
                Logger.d("... going to return an internal dir:" + file_path);
                if (file.exists()) {
                Logger.d("... file exists:" + file.getAbsolutePath());
                } else {
                Logger.e("!!! file does't exist:" + file.getAbsolutePath());
                }
                return file;
                }

                private byte readBytesFromFile(File file) {
                Logger.d(">>> path:" + file.getAbsolutePath());
                FileInputStream fis;
                long file_length;
                byte buffer;
                int offset = 0;
                int next = 0;
                if (!file.exists()) {
                Logger.e("!!! file doesn't exists");
                return null;
                }
                if (file.length() > Integer.MAX_VALUE) {
                Logger.e("!!! file length is out of max of int");
                return null;
                } else {
                file_length = file.length();
                }
                try {
                fis = new FileInputStream(file);
                //buffer = new byte[(int) file_length];
                buffer = new byte[(int) file.length()];
                long time_start = System.currentTimeMillis();
                while (true) {
                Logger.d("... now next:" + next + " and offset:" + offset);
                if (System.currentTimeMillis() - time_start > 1000) {
                Logger.e("!!! left due to time out");
                break;
                }
                next = fis.read(buffer, offset, (buffer.length-offset));
                if (next < 0 || offset >= buffer.length) {
                Logger.d("... completed to read");
                break;
                }
                offset += next;
                }
                //if (offset < buffer.length) {
                if (offset < (int) file_length) {
                Logger.e("!!! not complete to read");
                return null;
                }
                fis.close();
                return buffer;
                } catch (IOException e) {
                e.printStackTrace();
                Logger.e("!!! IOException");
                return null;
                }
                }

                public byte readBytesFromFile(File file, boolean is_fis_fos_only) {
                if (file == null) return null;
                if (is_fis_fos_only) {
                return readBytesFromFile(file);
                }
                Logger.d(">>> path:" + file.getAbsolutePath());
                FileInputStream fis;
                BufferedInputStream bis;
                ByteArrayOutputStream bos;
                byte buf = new byte[(int) file.length()];
                int num_read;
                if (!file.exists()) {
                Logger.e("!!! file doesn't exists");
                return null;
                }
                try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                bos = new ByteArrayOutputStream();
                long time_start = System.currentTimeMillis();
                while (true) {
                if (System.currentTimeMillis() - time_start > 1000) {
                Logger.e("!!! left due to time out");
                break;
                }
                num_read = bis.read(buf, 0, buf.length); //1024 bytes per call
                if (num_read < 0) break;
                bos.write(buf, 0, num_read);
                }
                buf = bos.toByteArray();
                fis.close();
                bis.close();
                bos.close();
                return buf;
                } catch (FileNotFoundException e) {
                e.printStackTrace();
                Logger.e("!!! FileNotFoundException");
                return null;
                } catch (IOException e) {
                e.printStackTrace();
                Logger.e("!!! IOException");
                return null;
                }
                }

                /**
                * streams (InputStream and OutputStream) transfer binary data
                * if to write a string to a stream, must first convert it to bytes, or in other words encode it
                */
                public boolean writeStringToFile(File file, String string, Charset charset) {
                if (file == null) return false;
                if (string == null) return false;
                return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
                }

                public boolean writeBytesToFile(File file, byte data) {
                if (file == null) return false;
                if (data == null) return false;
                FileOutputStream fos;
                BufferedOutputStream bos;
                try {
                fos = new FileOutputStream(file);
                bos = new BufferedOutputStream(fos);
                bos.write(data, 0, data.length);
                bos.flush();
                bos.close();
                fos.close();
                } catch (IOException e) {
                e.printStackTrace();
                Logger.e("!!! IOException");
                return false;
                }
                return true;
                }

                /**
                * io blocks until some input/output is available.
                */
                public boolean copy(File source, File destination) {
                if (source == null || destination == null) return false;
                Logger.d(">>> source:" + source.getAbsolutePath() + ", destination:" + destination.getAbsolutePath());
                try {
                FileInputStream fis = new FileInputStream(source);
                FileOutputStream fos = new FileOutputStream(destination);
                byte buffer = new byte[(int) source.length()];
                int len;
                while (EOF != (len = fis.read(buffer))) {
                fos.write(buffer, 0, len);
                }
                if (true) { //debug
                byte copies = readBytesFromFile(destination);
                if (copies != null) {
                int copy_len = copies.length;
                Logger.d("... stream read and write done for " + copy_len + " bytes");
                }
                }
                return destination.length() != 0;
                } catch (IOException e) {
                e.printStackTrace();
                return false;
                }
                }

                public void list(final String path, final String end, final List<File> files) {
                Logger.d(">>> path:" + path + ", end:" + end);
                File file = new File(path);
                if (file.isDirectory()) {
                for (File child : file.listFiles()){
                list(child.getAbsolutePath(), end, files);
                }
                } else if (file.isFile()) {
                if (end.equals("")) {
                files.add(file);
                } else {
                if (file.getName().endsWith(end)) files.add(file);
                }
                }
                }

                public String splitFileName(File file, String split) {
                String path;
                String ext;
                int lastIndexOfSplit = file.getAbsolutePath().lastIndexOf(split);
                if (lastIndexOfSplit < 0) {
                path = file.getAbsolutePath();
                ext = "";
                } else {
                path = file.getAbsolutePath().substring(0, lastIndexOfSplit);
                ext = file.getAbsolutePath().substring(lastIndexOfSplit);
                }
                return new String {path, ext};
                }

                public File rename(File old_file, String new_name) {
                if (old_file == null || new_name == null) return null;
                Logger.d(">>> old file path:" + old_file.getAbsolutePath() + ", new file name:" + new_name);
                File new_file = new File(old_file, new_name);
                if (!old_file.equals(new_file)) {
                if (new_file.exists()) { //if find out previous file/dir at new path name exists
                if (new_file.delete()) {
                Logger.d("... succeeded to delete previous file at new abstract path name:" + new_file.getAbsolutePath());
                } else {
                Logger.e("!!! failed to delete previous file at new abstract path name");
                return null;
                }
                }
                if (old_file.renameTo(new_file)) {
                Logger.d("... succeeded to rename old file to new abstract path name:" + new_file.getAbsolutePath());
                } else {
                Logger.e("!!! failed to rename old file to new abstract path name");
                }
                } else {
                Logger.d("... new and old file have the equal abstract path name:" + new_file.getAbsolutePath());
                }
                return new_file;
                }

                public boolean remove(final String path, final String end) {
                Logger.d(">>> path:" + path + ", end:" + end);
                File file = new File(path);
                boolean result = false;
                if (file.isDirectory()) {
                for (File child : file.listFiles()){
                result = remove(child.getAbsolutePath(), end);
                }
                } else if (file.isFile()) {
                if (end.equals("")) {
                result = file.delete();
                } else {
                if (file.getName().endsWith(end)) result = file.delete();
                }
                } else {
                Logger.e("!!! child is not file or directory");
                }
                return result;
                }

                @TargetApi(Build.VERSION_CODES.O)
                public byte readNIOBytesFromFile(String path) throws IOException {
                Logger.d(">>> path:" + path);
                if (!Files.exists(Paths.get(path), LinkOption.NOFOLLOW_LINKS)) {
                Logger.e("!!! file doesn't exists");
                return null;
                } else {
                return Files.readAllBytes(Paths.get(path));
                }
                }

                @TargetApi(Build.VERSION_CODES.O)
                public File writeNIOBytesToFile(String dir, String name, byte data) {
                Logger.d(">>> dir:" + dir + ", name:" + name);
                Path path_dir;
                Path path_file;
                try {
                if (!Files.exists(Paths.get(dir), LinkOption.NOFOLLOW_LINKS)) {
                Logger.d("... make a dir");
                path_dir = Files.createDirectories(Paths.get(dir));
                if (path_dir == null) {
                Logger.e("!!! failed to make a dir");
                return null;
                }
                }
                path_file = Files.write(Paths.get(name), data);
                return path_file.toFile();
                } catch (IOException e) {
                e.printStackTrace();
                Logger.e("!!! IOException");
                return null;
                }
                }

                @TargetApi(Build.VERSION_CODES.O)
                public void listNIO(final String dir, final String end, final List<File> files) throws IOException {
                Logger.d(">>> dir:" + dir + ", end:" + end);
                Files.walkFileTree(Paths.get(dir), new FileVisitor<Path>() {
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
                Logger.d("... file:" + dir.getFileName());
                return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                Logger.d("... file:" + file.getFileName());
                if (end.equals("")) {
                files.add(file.toFile());
                } else {
                if (file.endsWith(end)) files.add(file.toFile());
                }
                return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) {
                Logger.d("... file:" + file.getFileName());
                if (end.equals("")) {
                files.add(file.toFile());
                } else {
                if (file.endsWith(end)) files.add(file.toFile());
                }
                return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
                Logger.d("... file:" + dir.getFileName());
                return FileVisitResult.CONTINUE;
                }
                });
                }

                /**
                * recursion
                */
                private int factorial (int x) {
                if (x > 1) return (x*(factorial(x-1)));
                else if (x == 1) return x;
                else return 0;
                }


                }







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 22 '18 at 7:34

























                answered Nov 22 '18 at 6:46









                牟家宏牟家宏

                215




                215






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f22285255%2fandroid-write-string-to-file%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Guess what letter conforming each word

                    Port of Spain

                    Run scheduled task as local user group (not BUILTIN)