ファイルを作成しようとしていますが、Permission deniedとなり、作成が出来ません。
ディレクトリを作成する場合mkdir(下記のコードではmkdirの必要が生じなくなっています)で、そこを通過してもファイルを作成する段階(createNewFile)でエラーになります。

デバック機器のOSはOreoVersionです。

ManifestやAppのストレージ権限と、考えられる権限は与えています。
しかし、「アクセス拒否」となってしまいます。

参考書や複数のホームページ等を参考にしつつ、最低限必要そうな手は打っているつもりです。

どうして書き込みが出来ないのでしょうか?
書き込みが出来ない現象において、ほかに確認・改善すべき箇所があるのでしょうか?
ご指導のほど、よろしくお願いいたします。

Manifestに次の記述もしています。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

ソースコード

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //パーミッションチェック
        checkPermission();

        //FileAccessTest
        FileSave();
        FileLoad();
    }

    // この定数は0以上の値をアプリ内で適当に決めて良い
    private final int EXTERNAL_STORAGE_REQUEST_CODE = 1;

    // Permissionの確認
    @TargetApi(Build.VERSION_CODES.M)
    public void checkPermission() {
        // 既に許可している
        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED) {
            return;
        }
        // 許可していない場合、パーミッションの取得を行う
        // 以前拒否されている場合は、なぜ必要かを通知し、手動で許可してもらう
        if (!shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE)) {
            Toast.makeText(this, "ファイル書き込みのために許可してください", Toast.LENGTH_SHORT).show();
        }
        // パーミッションの取得を依頼
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_REQUEST_CODE);
    }
}

public class FileAccess {
    private static final String FILE_NAME = "test.xml";
    //書き出し
    public static boolean FileSave(){
        Boolean fRef = false;
        DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();

        try {
            DocumentBuilder dbuilder = dbfactory.newDocumentBuilder();
            Document document = dbuilder.newDocument();
            Element root = document.createElement("Test");
            Element child = document.createElement("Item");

            //test
            Text text = document.createTextNode(String.valueOf("TestData"));
            child.appendChild(text);

            root.appendChild(child);
            document.appendChild(root);

            TransformerFactory tffactory = TransformerFactory.newInstance();
            Transformer transformer = tffactory.newTransformer();
            String path = Environment.getExternalStorageDirectory().toString();
            File dir = new File(path);

            if(!dir.exists()){
                dir.mkdir();
            }

            File file = new File(path + "/" + FILE_NAME);

            if(!file.exists()){
                file.createNewFile();  //これがエラー
            }

            transformer.transform(new DOMSource(document), new StreamResult(file));
            //書き込み終了のメッセージ
            fRef = true;
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        return fRef;
    }

    //読み込み
    public static boolean FileLoad() {

        try {
            String path = Environment.getExternalStorageDirectory().toString();
            File dir = new File(path);
            //File file = new File(path + "/" + FILE_NAME);

            String listXmlPath = path + "/" + FILE_NAME;
            String content = new Scanner(new File(listXmlPath)).useDelimiter("\\z").next();
            //XMLファイルをまとめて読み込み
            XmlPullParser xpp = Xml.newPullParser();

            xpp.setInput(new StringReader(content));
            //解析するXMLファイルの中身を渡す
            int eventType = xpp.getEventType();
            int element = 0;

            while(eventType != XmlPullParser.END_DOCUMENT){
                switch(eventType){
                    case XmlPullParser.START_DOCUMENT:
                        Log.i("MainActivity", "ドキュメント開始");
                        break;
                    case XmlPullParser.START_TAG:
                        Log.i("MainActivity", xpp.getName() + "要素開始");
                        int attrCount = xpp.getAttributeCount();

                        for(int i = 0; i < attrCount; ++i){
                            Log.i("MainActivity", "    " +
                                i + "番目の属性 = " + xpp.getAttributeName(i));
                        }
                        break;
                    case XmlPullParser.TEXT:
                        Log.i("MainActivity", "テキスト = (" + element + ") " + xpp.getText());
                        element = 0;
                        break;
                    case XmlPullParser.END_TAG:
                        Log.i("MainActivity", xpp.getName() + "要素終了");
                        break;
                }
                eventType = xpp.next();
                //次のトークンに進む
            }

            Log.i("MainActivity", "ドキュメント終了");
        } catch (XmlPullParserException e) {
            Log.e("MainActivity", "XMLの解析失敗.");
        }catch(IOException e){
            Log.e("MainActivity", "XMLファイルの読み込みに失敗.");
        }
    return true;
    }
}